/*
 Highcharts JS v2.1.4 (2011-03-02)

 (c) 2009-2010 Torstein H?nsi

 License: www.highcharts.com/license
*/
(function () {
  function qa(a, b) {
    a || (a = {});
    for (var c in b) a[c] = b[c];
    return a
  }
  function oa(a, b) {
    return parseInt(a, b || 10)
  }
  function Kb(a) {
    return typeof a == "string"
  }
  function Eb(a) {
    return typeof a == "object"
  }
  function ac(a) {
    return typeof a == "number"
  }
  function mc(a, b) {
    for (var c = a.length; c--;) if (a[c] == b) {
      a.splice(c, 1);
      break
    }
  }
  function J(a) {
    return a !== Ra && a !== null
  }
  function za(a, b, c) {
    var d, e;
    if (Kb(b)) if (J(c)) a.setAttribute(b, c);
    else {
      if (a && a.getAttribute) e = a.getAttribute(b)
    }
    else if (J(b) && Eb(b)) for (d in b) a.setAttribute(d, b[d]);
    return e
  }
  function nc(a) {
    if (!a || a.constructor != Array) a = [a];
    return a
  }
  function y() {
    var a = arguments,
        b, c, d = a.length;
    for (b = 0; b < d; b++) {
      c = a[b];
      if (typeof c !== "undefined" && c !== null) return c
    }
  }
  function Wd(a) {
    var b = "",
        c;
    for (c in a) b += Ad(c) + ":" + a[c] + ";";
    return b
  }
  function Ia(a, b) {
    if (Ac) if (b && b.opacity !== Ra) b.filter = "alpha(opacity=" + b.opacity * 100 + ")";
    qa(a.style, b)
  }
  function fb(a, b, c, d, e) {
    a = Aa.createElement(a);
    b && qa(a, b);
    e && Ia(a, {
      padding: 0,
      border: nb,
      margin: 0
    });
    c && Ia(a, c);
    d && d.appendChild(a);
    return a
  }
  function bc(a, b) {
    Bc = y(a, b.animation)
  }
  function Bd() {
    var a = Sa.global.useUTC;
    Cc = a ? Date.UTC : function (b, c, d, e, f, g) {
      return (new Date(b, c, y(d, 1), y(e, 0), y(f, 0), y(g, 0))).getTime()
    };
    bd = a ? "getUTCMinutes" : "getMinutes";
    cd = a ? "getUTCHours" : "getHours";
    dd = a ? "getUTCDay" : "getDay";
    oc = a ? "getUTCDate" : "getDate";
    Dc = a ? "getUTCMonth" : "getMonth";
    Ec = a ? "getUTCFullYear" : "getFullYear";
    Cd = a ? "setUTCMinutes" : "setMinutes";
    Dd = a ? "setUTCHours" : "setHours";
    ed = a ? "setUTCDate" : "setDate";
    Ed = a ? "setUTCMonth" : "setMonth";
    Fd = a ? "setUTCFullYear" : "setFullYear"
  }
  function Fc(a) {
    Gc || (Gc = fb(Lb));
    a && Gc.appendChild(a);
    Gc.innerHTML = ""
  }
  function xb(a, b) {
    var c = function () {};
    c.prototype = new a;
    qa(c.prototype, b);
    return c
  }
  function Gd(a, b, c, d) {
    var e = Sa.lang;
    a = a;
    var f = isNaN(b = cb(b)) ? 2 : b;
    b = c === undefined ? e.decimalPoint : c;
    d = d === undefined ? e.thousandsSep : d;
    e = a < 0 ? "-" : "";
    c = oa(a = cb(+a || 0).toFixed(f)) + "";
    var g = (g = c.length) > 3 ? g % 3 : 0;
    return e + (g ? c.substr(0, g) + d : "") + c.substr(g).replace(/(\d{3})(?=\d)/g, "$1" + d) + (f ? b + cb(a - c).toFixed(f).slice(2) : "")
  }
  function Hc() {}
  function Hd(a, b) {
    function c(m, h) {
      function x(l, p) {
        this.pos = l;
        this.minor = p;
        this.isNew = true;
        p || this.addLabel()
      }
      function w(l) {
        if (l) {
          this.options = l;
          this.id = l.id
        }
        return this
      }
      function O() {
        var l = [],
            p = [],
            r;
        Ta = u = null;
        Z = [];
        t(Ba, function (o) {
          r = false;
          t(["xAxis", "yAxis"], function (la) {
            if (o.isCartesian && (la == "xAxis" && ma || la == "yAxis" && !ma) && (o.options[la] == h.index || o.options[la] === Ra && h.index === 0)) {
              o[la] = s;
              Z.push(o);
              r = true
            }
          });
          if (!o.visible && v.ignoreHiddenSeries) r = false;
          if (r) {
            var T, Y, G, B, ia;
            if (!ma) {
              T = o.options.stacking;
              Ic = T == "percent";
              if (T) {
                B = o.type + y(o.options.stack, "");
                ia = "-" + B;
                o.stackKey = B;
                Y = l[B] || [];
                l[B] = Y;
                G = p[ia] || [];
                p[ia] = G
              }
              if (Ic) {
                Ta = 0;
                u = 99
              }
            }
            if (o.isCartesian) {
              t(o.data, function (la) {
                var C = la.x,
                    na = la.y,
                    S = na < 0,
                    $ = S ? G : Y;
                S = S ? ia : B;
                if (Ta === null) Ta = u = la[H];
                if (ma) if (C > u) u = C;
                else {
                  if (C < Ta) Ta = C
                }
                else if (J(na)) {
                  if (T) $[C] = J($[C]) ? $[C] + na : na;
                  na = $ ? $[C] : na;
                  la = y(la.low, na);
                  if (!Ic) if (na > u) u = na;
                  else if (la < Ta) Ta = la;
                  if (T) {
                    ea[S] || (ea[S] = {});
                    ea[S][C] = {
                      total: na,
                      cum: na
                    }
                  }
                }
              });
              if (/(area|column|bar)/.test(o.type) && !ma) if (Ta >= 0) {
                Ta = 0;
                Id = true
              }
              else if (u < 0) {
                u = 0;
                Jd = true
              }
            }
          }
        })
      }
      function ja(l, p) {
        var r;
        Fb = p ? 1 : Ua.pow(10, ob(Ua.log(l) / Ua.LN10));
        r = l / Fb;
        if (!p) {
          p = [1, 2, 2.5, 5, 10];
          if (h.allowDecimals === false) if (Fb == 1) p = [1, 2, 5, 10];
          else if (Fb <= 0.1) p = [1 / Fb]
        }
        for (var o = 0; o < p.length; o++) {
          l = p[o];
          if (r <= (p[o] + (p[o + 1] || p[o])) / 2) break
        }
        l *= Fb;
        return l
      }
      function L(l) {
        var p;
        p = l;
        if (J(Fb)) {
          p = (Fb < 1 ? fa(1 / Fb) : 1) * 10;
          p = fa(l * p) / p
        }
        return p
      }
      function ga() {
        var l, p, r, o, T = h.tickInterval,
            Y = h.tickPixelInterval;
        l = h.maxZoom || (ma ? pb(m.smallestInterval * 5, u - Ta) : null);
        A = M ? wa : sa;
        if (Mb) {
          r = m[ma ? "xAxis" : "yAxis"][h.linkedTo];
          o = r.getExtremes();
          K = y(o.min, o.dataMin);
          P = y(o.max, o.dataMax)
        }
        else {
          K = y(pa, h.min, Ta);
          P = y(Na, h.max, u)
        }
        if (P - K < l) {
          o = (l - P + K) / 2;
          K = Ca(K - o, y(h.min, K - o), Ta);
          P = pb(K + l, y(h.max, K + l), u)
        }
        if (!Va && !Ic && !Mb && J(K) && J(P)) {
          l = P - K || 1;
          if (!J(h.min) && !J(pa) && Vb && (Ta < 0 || !Id)) K -= l * Vb;
          if (!J(h.max) && !J(Na) && Kd && (u > 0 || !Jd)) P += l * Kd
        }
        Wa = K == P ? 1 : Mb && !T && Y == r.options.tickPixelInterval ? r.tickInterval : y(T, Va ? 1 : (P - K) * Y / A);
        if (!N && !J(h.tickInterval)) Wa = ja(Wa);
        s.tickInterval = Wa;
        Jc = h.minorTickInterval === "auto" && Wa ? Wa / 5 : h.minorTickInterval;
        if (N) {
          ra = [];
          T = Sa.global.useUTC;
          var G = 1E3 / qb,
              B = 6E4 / qb,
              ia = 36E5 / qb;
          Y = 864E5 / qb;
          l = 6048E5 / qb;
          o = 2592E6 / qb;
          var la = 31556952E3 / qb,
              C = [
              ["second", G, [1, 2, 5, 10, 15, 30]],
              ["minute", B, [1, 2, 5, 10, 15, 30]],
              ["hour", ia, [1, 2, 3, 4, 6, 8, 12]],
              ["day", Y, [1, 2]],
              ["week", l, [1, 2]],
              ["month", o, [1, 2, 3, 4, 6]],
              ["year", la, null]
              ],
              na = C[6],
              S = na[1],
              $ = na[2];
          for (r = 0; r < C.length; r++) {
            na = C[r];
            S = na[1];
            $ = na[2];
            if (C[r + 1]) if (Wa <= (S * $[$.length - 1] + C[r + 1][1]) / 2) break
          }
          if (S == la && Wa < 5 * S) $ = [1, 2, 5];
          C = ja(Wa / S, $);
          $ = new Date(K * qb);
          $.setMilliseconds(0);
          if (S >= G) $.setSeconds(S >= B ? 0 : C * ob($.getSeconds() / C));
          if (S >= B) $[Cd](S >= ia ? 0 : C * ob($[bd]() / C));
          if (S >= ia) $[Dd](S >= Y ? 0 : C * ob($[cd]() / C));
          if (S >= Y) $[ed](S >= o ? 1 : C * ob($[oc]() / C));
          if (S >= o) {
            $[Ed](S >= la ? 0 : C * ob($[Dc]() / C));
            p = $[Ec]()
          }
          if (S >= la) {
            p -= p % C;
            $[Fd](p)
          }
          S == l && $[ed]($[oc]() - $[dd]() + h.startOfWeek);
          r = 1;
          p = $[Ec]();
          G = $.getTime() / qb;
          B = $[Dc]();
          for (ia = $[oc](); G < P && r < wa;) {
            ra.push(G);
            if (S == la) G = Cc(p + r * C, 0) / qb;
            else if (S == o) G = Cc(p, B + r * C) / qb;
            else if (!T && (S == Y || S == l)) G = Cc(p, B, ia + r * C * (S == Y ? 1 : 7));
            else G += S * C;
            r++
          }
          ra.push(G);
          Kc = h.dateTimeLabelFormats[na[0]]
        }
        else {
          r = ob(K / Wa) * Wa;
          p = fd(P / Wa) * Wa;
          ra = [];
          for (r = L(r); r <= p;) {
            ra.push(r);
            r = L(r + Wa)
          }
        }
        if (!Mb) {
          if (Va || ma && m.hasColumn) {
            p = (Va ? 1 : Wa) * 0.5;
            if (Va || !J(y(h.min, pa))) K -= p;
            if (Va || !J(y(h.max, Na))) P += p
          }
          p = ra[0];
          r = ra[ra.length - 1];
          if (h.startOnTick) K = p;
          else K > p && ra.shift();
          if (h.endOnTick) P = r;
          else P < r && ra.pop();
          Gb || (Gb = {
            x: 0,
            y: 0
          });
          if (!N && ra.length > Gb[H]) Gb[H] = ra.length
        }
      }
      function Ea() {
        var l, p;
        gb = K;
        cc = P;
        O();
        ga();
        ha = D;
        D = A / (P - K || 1);
        if (!ma) for (l in ea) for (p in ea[l]) ea[l][p].cum = ea[l][p].total;
        if (!s.isDirty) s.isDirty = K != gb || P != cc
      }
      function ua(l) {
        l = (new w(l)).render();
        Nb.push(l);
        return l
      }
      function bb() {
        var l = h.title,
            p = h.alternateGridColor,
            r = h.lineWidth,
            o, T, Y = m.hasRendered,
            G = Y && J(gb) && !isNaN(gb);
        o = Z.length && J(K) && J(P);
        A = M ? wa : sa;
        D = A / (P - K || 1);
        xa = M ? V : rb;
        if (o || Mb) {
          if (Jc && !Va) for (o = K + (ra[0] - K) % Jc; o <= P; o += Jc) {
            Wb[o] || (Wb[o] = new x(o, true));
            G && Wb[o].isNew && Wb[o].render(null, true);
            Wb[o].isActive = true;
            Wb[o].render()
          }
          t(ra, function (B, ia) {
            if (!Mb || B >= K && B <= P) {
              G && sb[B].isNew && sb[B].render(ia, true);
              sb[B].isActive = true;
              sb[B].render(ia)
            }
          });
          p && t(ra, function (B, ia) {
            if (ia % 2 === 0 && B < P) {
              dc[B] || (dc[B] = new w);
              dc[B].options = {
                from: B,
                to: ra[ia + 1] !== Ra ? ra[ia + 1] : P,
                color: p
              };
              dc[B].render();
              dc[B].isActive = true
            }
          });
          Y || t((h.plotLines || []).concat(h.plotBands || []), function (B) {
            Nb.push((new w(B)).render())
          })
        }
        t([sb, Wb, dc], function (B) {
          for (var ia in B) if (B[ia].isActive) B[ia].isActive = false;
          else {
            B[ia].destroy();
            delete B[ia]
          }
        });
        if (r) {
          o = V + (Oa ? wa : 0) + Q;
          T = Pa - rb - (Oa ? sa : 0) + Q;
          o = aa.crispLine([Za, M ? V : o, M ? T : ba, Da, M ? Xa - Ab : o, M ? T : Pa - rb], r);
          if (Fa) Fa.animate({
            d: o
          });
          else Fa = aa.path(o).attr({
            stroke: h.lineColor,
            "stroke-width": r,
            zIndex: 7
          }).add()
        }
        if (s.axisTitle) {
          o = M ? V : ba;
          r = oa(l.style.fontSize || 12);
          o = {
            low: o + (M ? 0 : A),
            middle: o + A / 2,
            high: o + (M ? A : 0)
          }[l.align];
          r = (M ? ba + sa : V) + (M ? 1 : -1) * (Oa ? -1 : 1) * gd + (E == 2 ? r : 0);
          s.axisTitle[Y ? "animate" : "attr"]({
            x: M ? o : r + (Oa ? wa : 0) + Q + (l.x || 0),
            y: M ? r - (Oa ? sa : 0) + Q : o + (l.y || 0)
          })
        }
        s.isDirty = false
      }
      function Ja(l) {
        for (var p = Nb.length; p--;) Nb[p].id == l && Nb[p].destroy()
      }
      var ma = h.isX,
          Oa = h.opposite,
          M = Ga ? !ma : ma,
          E = M ? Oa ? 0 : 2 : Oa ? 1 : 3,
          ea = {};
      h = ya(ma ? Lc : hd, [Xd, Yd, Ld, Zd][E], h);
      var s = this,
          N = h.type == "datetime",
          Q = h.offset || 0,
          H = ma ? "x" : "y",
          A, D, ha, xa = M ? V : rb,
          va, Ka, tb, Hb, Fa, Ta, u, Z, pa, Na, P = null,
          K = null,
          gb, cc, Vb = h.minPadding,
          Kd = h.maxPadding,
          Mb = J(h.linkedTo),
          Id, Jd, Ic, Md = h.events,
          id, Nb = [],
          Wa, Jc, Fb, ra, sb = {},
          Wb = {},
          dc = {},
          ec, fc, gd, Kc, Va = h.categories,
          $d = h.labels.formatter ||
      function () {
        var l = this.value;
        return Kc ? Mc(Kc, l) : Wa % 1E6 === 0 ? l / 1E6 + "M" : Wa % 1E3 === 0 ? l / 1E3 + "k" : !Va && l >= 1E3 ? Gd(l, 0) : l
      }, Nc = M && h.labels.staggerLines, Xb = h.reversed, Yb = Va && h.tickmarkPlacement == "between" ? 0.5 : 0;
      x.prototype = {
        addLabel: function () {
          var l = this.pos,
              p = h.labels,
              r = !(l == K && !y(h.showFirstLabel, 1) || l == P && !y(h.showLastLabel, 0)),
              o = Va && M && Va.length && !p.step && !p.staggerLines && !p.rotation && wa / Va.length || !M && wa / 2,
              T = this.label;
          l = $d.call({
            isFirst: l == ra[0],
            isLast: l == ra[ra.length - 1],
            dateTimeLabelFormat: Kc,
            value: Va && Va[l] ? Va[l] : l
          });
          o = o && {
            width: o - 2 * (p.padding || 10) + $a
          };
          o = qa(o, p.style);
          if (T === Ra) this.label = J(l) && r && p.enabled ? aa.text(l, 0, 0).attr({
            align: p.align,
            rotation: p.rotation
          }).css(o).add(tb) : null;
          else T && T.attr({
            text: l
          }).css(o)
        },
        getLabelSize: function () {
          var l = this.label;
          return l ? (this.labelBBox = l.getBBox())[M ? "height" : "width"] : 0
        },
        render: function (l, p) {
          var r = !this.minor,
              o = this.label,
              T = this.pos,
              Y = h.labels,
              G = this.gridLine,
              B = r ? h.gridLineWidth : h.minorGridLineWidth,
              ia = r ? h.gridLineColor : h.minorGridLineColor,
              la = r ? h.gridLineDashStyle : h.minorGridLineDashStyle,
              C = this.mark,
              na = r ? h.tickLength : h.minorTickLength,
              S = r ? h.tickWidth : h.minorTickWidth || 0,
              $ = r ? h.tickColor : h.minorTickColor,
              pc = r ? h.tickPosition : h.minorTickPosition;
          r = Y.step;
          var hb = p && Oc || Pa,
              Ob;
          Ob = M ? va(T + Yb, null, null, p) + xa : V + Q + (Oa ? (p && jd || Xa) - Ab - V : 0);
          hb = M ? hb - rb + Q - (Oa ? sa : 0) : hb - va(T + Yb, null, null, p) - xa;
          if (B) {
            T = Ka(T + Yb, B, p);
            if (G === Ra) {
              G = {
                stroke: ia,
                "stroke-width": B
              };
              if (la) G.dashstyle = la;
              this.gridLine = G = B ? aa.path(T).attr(G).add(Hb) : null
            }
            G && T && G.animate({
              d: T
            })
          }
          if (S) {
            if (pc == "inside") na = -na;
            if (Oa) na = -na;
            B = aa.crispLine([Za, Ob, hb, Da, Ob + (M ? 0 : -na), hb + (M ? na : 0)], S);
            if (C) C.animate({
              d: B
            });
            else this.mark = aa.path(B).attr({
              stroke: $,
              "stroke-width": S
            }).add(tb)
          }
          if (o) {
            Ob = Ob + Y.x - (Yb && M ? Yb * D * (Xb ? -1 : 1) : 0);
            hb = hb + Y.y - (Yb && !M ? Yb * D * (Xb ? 1 : -1) : 0);
            J(Y.y) || (hb += parseInt(o.styles.lineHeight) * 0.9 - o.getBBox().height / 2);
            if (Nc) hb += l % Nc * 16;
            if (r) o[l % r ? "hide" : "show"]();
            o[this.isNew ? "attr" : "animate"]({
              x: Ob,
              y: hb
            })
          }
          this.isNew = false
        },
        destroy: function () {
          for (var l in this) this[l] && this[l].destroy && this[l].destroy()
        }
      };
      w.prototype = {
        render: function () {
          var l = this,
              p = l.options,
              r = p.label,
              o = l.label,
              T = p.width,
              Y = p.to,
              G, B = p.from,
              ia = p.dashStyle,
              la = l.svgElem,
              C = [],
              na, S, $ = p.color;
          S = p.zIndex;
          var pc = p.events;
          if (T) {
            C = Ka(p.value, T);
            p = {
              stroke: $,
              "stroke-width": T
            };
            if (ia) p.dashstyle = ia
          }
          else if (J(B) && J(Y)) {
            B = Ca(B, K);
            Y = pb(Y, P);
            G = Ka(Y);
            if ((C = Ka(B)) && G) C.push(G[4], G[5], G[1], G[2]);
            else C = null;
            p = {
              fill: $
            }
          }
          else return;
          if (J(S)) p.zIndex = S;
          if (la) if (C) la.animate({
            d: C
          }, null, la.onGetPath);
          else {
            la.hide();
            la.onGetPath = function () {
              la.show()
            }
          }
          else if (C && C.length) {
            l.svgElem = la = aa.path(C).attr(p).add();
            if (pc) {
              ia = function (hb) {
                la.on(hb, function (Ob) {
                  pc[hb].apply(l, [Ob])
                })
              };
              for (na in pc) ia(na)
            }
          }
          if (r && J(r.text) && C && C.length && wa > 0 && sa > 0) {
            r = ya({
              align: M && G && "center",
              x: M ? !G && 4 : 10,
              verticalAlign: !M && G && "middle",
              y: M ? G ? 16 : 10 : G ? 6 : -4,
              rotation: M && !G && 90
            }, r);
            if (!o) l.label = o = aa.text(r.text, 0, 0).attr({
              align: r.textAlign || r.align,
              rotation: r.rotation,
              zIndex: S
            }).css(r.style).add();
            G = [C[1], C[4], C[6] || C[1]];
            C = [C[2], C[5], C[7] || C[2]];
            na = pb.apply(Ua, G);
            S = pb.apply(Ua, C);
            o.align(r, false, {
              x: na,
              y: S,
              width: Ca.apply(Ua, G) - na,
              height: Ca.apply(Ua, C) - S
            });
            o.show()
          }
          else o && o.hide();
          return l
        },
        destroy: function () {
          for (var l in this) {
            this[l] && this[l].destroy && this[l].destroy();
            delete this[l]
          }
          mc(Nb, this)
        }
      };
      va = function (l, p, r, o) {
        var T = 1,
            Y = 0,
            G = o ? ha : D;
        o = o ? gb : K;
        G || (G = D);
        if (r) {
          T *= -1;
          Y = A
        }
        if (Xb) {
          T *= -1;
          Y -= T * A
        }
        if (p) {
          if (Xb) l = A - l;
          l = l / G + o
        }
        else l = T * (l - o) * G + Y;
        return l
      };
      Ka = function (l, p, r) {
        var o, T, Y;
        l = va(l, null, null, r);
        var G = r && Oc || Pa,
            B = r && jd || Xa,
            ia;
        r = T = fa(l + xa);
        o = Y = fa(G - l - xa);
        if (isNaN(l)) ia = true;
        else if (M) {
          o = ba;
          Y = G - rb;
          if (r < V || r > V + wa) ia = true
        }
        else {
          r = V;
          T = B - Ab;
          if (o < ba || o > ba + sa) ia = true
        }
        return ia ? null : aa.crispLine([Za, r, o, Da, T, Y], p || 0)
      };
      if (Ga && ma && Xb === Ra) Xb = true;
      qa(s, {
        addPlotBand: ua,
        addPlotLine: ua,
        adjustTickAmount: function () {
          if (Gb && !N && !Va && !Mb) {
            var l = ec,
                p = ra.length;
            ec = Gb[H];
            if (p < ec) {
              for (; ra.length < ec;) ra.push(L(ra[ra.length - 1] + Wa));
              D *= (p - 1) / (ec - 1);
              P = ra[ra.length - 1]
            }
            if (J(l) && ec != l) s.isDirty = true
          }
        },
        categories: Va,
        getExtremes: function () {
          return {
            min: K,
            max: P,
            dataMin: Ta,
            dataMax: u
          }
        },
        getPlotLinePath: Ka,
        getThreshold: function (l) {
          if (K > l) l = K;
          else if (P < l) l = P;
          return va(l, 0, 1)
        },
        isXAxis: ma,
        options: h,
        plotLinesAndBands: Nb,
        getOffset: function () {
          var l = Z.length && J(K) && J(P),
              p = 0,
              r = 0,
              o = h.title,
              T = h.labels,
              Y = [-1, 1, 1, -1][E];
          if (!tb) {
            tb = aa.g("axis").attr({
              zIndex: 7
            }).add();
            Hb = aa.g("grid").attr({
              zIndex: 1
            }).add()
          }
          fc = 0;
          if (l || Mb) {
            t(ra, function (B) {
              if (sb[B]) sb[B].addLabel();
              else sb[B] = new x(B);
              if (E === 0 || E == 2 || {
                1: "left",
                3: "right"
              }[E] == T.align) fc = Ca(sb[B].getLabelSize(), fc)
            });
            if (Nc) fc += (Nc - 1) * 16
          }
          else for (var G in sb) {
            sb[G].destroy();
            delete sb[G]
          }
          if (o && o.text) {
            if (!s.axisTitle) s.axisTitle = aa.text(o.text, 0, 0).attr({
              zIndex: 7,
              rotation: o.rotation || 0,
              align: o.textAlign || {
                low: "left",
                middle: "center",
                high: "right"
              }[o.align]
            }).css(o.style).add();
            p = s.axisTitle.getBBox()[M ? "height" : "width"];
            r = y(o.margin, M ? 5 : 10)
          }
          Q = Y * (h.offset || Pb[E]);
          gd = fc + (E != 2 && fc && Y * h.labels[M ? "y" : "x"]) + r;
          Pb[E] = Ca(Pb[E], gd + p + Y * Q)
        },
        render: bb,
        setCategories: function (l, p) {
          s.categories = Va = l;
          t(Z, function (r) {
            r.translate();
            r.setTooltipPoints(true)
          });
          s.isDirty = true;
          y(p, true) && m.redraw()
        },
        setExtremes: function (l, p, r, o) {
          r = y(r, true);
          La(s, "setExtremes", {
            min: l,
            max: p
          }, function () {
            pa = l;
            Na = p;
            r && m.redraw(o)
          })
        },
        setScale: Ea,
        setTickPositions: ga,
        translate: va,
        redraw: function () {
          gc.resetTracker && gc.resetTracker();
          bb();
          t(Nb, function (l) {
            l.render()
          });
          t(Z, function (l) {
            l.isDirty = true
          })
        },
        removePlotBand: Ja,
        removePlotLine: Ja,
        reversed: Xb,
        stacks: ea
      });
      for (id in Md) Qa(s, id, Md[id]);
      Ea()
    }
    function d() {
      var m = {};
      return {
        add: function (h, x, w, O) {
          if (!m[h]) {
            x = aa.text(x, 0, 0).css(a.toolbar.itemStyle).align({
              align: "right",
              x: -Ab - 20,
              y: ba + 30
            }).on("click", O).attr({
              align: "right",
              zIndex: 20
            }).add();
            m[h] = x
          }
        },
        remove: function (h) {
          Fc(m[h].element);
          m[h] = null
        }
      }
    }
    function e(m) {
      function h() {
        var H = this.points || nc(this),
            A = H[0].series.xAxis,
            D = this.x;
        A = A && A.options.type == "datetime";
        var ha = Kb(D) || A,
            xa;
        xa = ha ? ['<span style="font-size: 10px">', A ? Mc("%A, %b %e, %Y", D) : D, "</span><br/>"] : [];
        t(H, function (va) {
          xa.push(va.point.tooltipFormatter(ha))
        });
        return xa.join("")
      }
      function x(H, A) {
        E = ma ? H : (2 * E + H) / 3;
        ea = ma ? A : (ea + A) / 2;
        s.translate(E, ea);
        kd = cb(H - E) > 1 || cb(A - ea) > 1 ?
        function () {
          x(H, A)
        } : null
      }
      function w() {
        if (!ma) {
          var H = q.hoverPoints;
          s.hide();
          t(ga, function (A) {
            A && A.hide()
          });
          H && t(H, function (A) {
            A.setState()
          });
          q.hoverPoints = null;
          ma = true
        }
      }
      var O, ja = m.borderWidth,
          L = m.crosshairs,
          ga = [],
          Ea = m.style,
          ua = m.shared,
          bb = oa(Ea.padding),
          Ja = ja + bb,
          ma = true,
          Oa, M, E = 0,
          ea = 0;
      Ea.padding = 0;
      var s = aa.g("tooltip").attr({
        zIndex: 8
      }).add(),
          N = aa.rect(Ja, Ja, 0, 0, m.borderRadius, ja).attr({
          fill: m.backgroundColor,
          "stroke-width": ja
        }).add(s).shadow(m.shadow),
          Q = aa.text("", bb + Ja, oa(Ea.fontSize) + bb + Ja).attr({
          zIndex: 1
        }).css(Ea).add(s);
      s.hide();
      return {
        shared: ua,
        refresh: function (H) {
          var A, D, ha, xa = 0,
              va = {},
              Ka = [];
          ha = H.tooltipPos;
          A = m.formatter || h;
          va = q.hoverPoints;
          var tb = function (Fa) {
              return {
                series: Fa.series,
                point: Fa,
                x: Fa.category,
                y: Fa.y,
                percentage: Fa.percentage,
                total: Fa.total || Fa.stackTotal
              }
              };
          if (ua) {
            va && t(va, function (Fa) {
              Fa.setState()
            });
            q.hoverPoints = H;
            t(H, function (Fa) {
              Fa.setState(yb);
              xa += Fa.plotY;
              Ka.push(tb(Fa))
            });
            D = H[0].plotX;
            xa = fa(xa) / H.length;
            va = {
              x: H[0].category
            };
            va.points = Ka;
            H = H[0]
          }
          else va = tb(H);
          va = A.call(va);
          O = H.series;
          D = ua ? D : H.plotX;
          xa = ua ? xa : H.plotY;
          A = fa(ha ? ha[0] : Ga ? wa - xa : D);
          D = fa(ha ? ha[1] : Ga ? sa - D : xa);
          ha = ua || !H.series.isCartesian || hc(A, D);
          if (va === false || !ha) w();
          else {
            if (ma) {
              s.show();
              ma = false
            }
            Q.attr({
              text: va
            });
            ha = Q.getBBox();
            Oa = ha.width + 2 * bb;
            M = ha.height + 2 * bb;
            N.attr({
              width: Oa,
              height: M,
              stroke: m.borderColor || H.color || O.color || "#606060"
            });
            A = A - Oa + V - 25;
            D = D - M + ba + 10;
            if (A < 7) {
              A = 7;
              D -= 30
            }
            if (D < 5) D = 5;
            else if (D + M > Pa) D = Pa - M - 5;
            x(fa(A - Ja), fa(D - Ja))
          }
          if (L) {
            L = nc(L);
            D = L.length;
            for (var Hb; D--;) if (L[D] && (Hb = H.series[D ? "yAxis" : "xAxis"])) {
              A = Hb.getPlotLinePath(H[D ? "y" : "x"], 1);
              if (ga[D]) ga[D].attr({
                d: A,
                visibility: Bb
              });
              else {
                ha = {
                  "stroke-width": L[D].width || 1,
                  stroke: L[D].color || "#C0C0C0",
                  zIndex: 2
                };
                if (L[D].dashStyle) ha.dashstyle = L[D].dashStyle;
                ga[D] = aa.path(A).attr(ha).add()
              }
            }
          }
        },
        hide: w
      }
    }
    function f(m, h) {
      function x(E) {
        var ea;
        E = E || ib.event;
        if (!E.target) E.target = E.srcElement;
        ea = E.touches ? E.touches.item(0) : E;
        if (E.type != "mousemove" || ib.opera) {
          for (var s = ta, N = {
            left: s.offsetLeft,
            top: s.offsetTop
          }; s = s.offsetParent;) {
            N.left += s.offsetLeft;
            N.top += s.offsetTop;
            if (s != Aa.body && s != Aa.documentElement) {
              N.left -= s.scrollLeft;
              N.top -= s.scrollTop
            }
          }
          qc = N
        }
        if (Ac) {
          E.chartX = E.x;
          E.chartY = E.y
        }
        else if (ea.layerX === Ra) {
          E.chartX = ea.pageX - qc.left;
          E.chartY = ea.pageY - qc.top
        }
        else {
          E.chartX = E.layerX;
          E.chartY = E.layerY
        }
        return E
      }
      function w(E) {
        var ea = {
          xAxis: [],
          yAxis: []
        };
        t(ab, function (s) {
          var N = s.translate,
              Q = s.isXAxis;
          ea[Q ? "xAxis" : "yAxis"].push({
            axis: s,
            value: N((Ga ? !Q : Q) ? E.chartX - V : sa - E.chartY + ba, true)
          })
        });
        return ea
      }
      function O() {
        var E = m.hoverSeries,
            ea = m.hoverPoint;
        ea && ea.onMouseOut();
        E && E.onMouseOut();
        rc && rc.hide();
        ld = null
      }
      function ja() {
        if (ua) {
          var E = {
            xAxis: [],
            yAxis: []
          },
              ea = ua.getBBox(),
              s = ea.x - V,
              N = ea.y - ba;
          if (Ea) {
            t(ab, function (Q) {
              var H = Q.translate,
                  A = Q.isXAxis,
                  D = Ga ? !A : A,
                  ha = H(D ? s : sa - N - ea.height, true);
              H = H(D ? s + ea.width : sa - N, true);
              E[A ? "xAxis" : "yAxis"].push({
                axis: Q,
                min: pb(ha, H),
                max: Ca(ha, H)
              })
            });
            La(m, "selection", E, md)
          }
          ua = ua.destroy()
        }
        m.mouseIsDown = nd = Ea = false;
        Cb(Aa, Ib ? "touchend" : "mouseup", ja)
      }
      var L, ga, Ea, ua, bb = v.zoomType,
          Ja = /x/.test(bb),
          ma = /y/.test(bb),
          Oa = Ja && !Ga || ma && Ga,
          M = ma && !Ga || Ja && Ga;
      Pc = function () {
        if (Qc) {
          Qc.translate(V, ba);
          Ga && Qc.attr({
            width: m.plotWidth,
            height: m.plotHeight
          }).invert()
        }
        else m.trackerGroup = Qc = aa.g("tracker").attr({
          zIndex: 9
        }).add()
      };
      Pc();
      if (h.enabled) m.tooltip = rc = e(h);
      (function () {
        var E = true;
        ta.onmousedown = function (s) {
          s = x(s);
          m.mouseIsDown = nd = true;
          L = s.chartX;
          ga = s.chartY;
          Qa(Aa, Ib ? "touchend" : "mouseup", ja)
        };
        var ea = function (s) {
            if (!(s && s.touches && s.touches.length > 1)) {
              s = x(s);
              if (!Ib) s.returnValue = false;
              var N = s.chartX,
                  Q = s.chartY,
                  H = !hc(N - V, Q - ba);
              if (Ib && s.type == "touchstart") if (za(s.target, "isTracker")) m.runTrackerClick || s.preventDefault();
              else!ae && !H && s.preventDefault();
              if (H) {
                E || O();
                if (N < V) N = V;
                else if (N > V + wa) N = V + wa;
                if (Q < ba) Q = ba;
                else if (Q > ba + sa) Q = ba + sa
              }
              if (nd && s.type != "touchstart") {
                if (Ea = Math.sqrt(Math.pow(L - N, 2) + Math.pow(ga - Q, 2)) > 10) {
                  if (ic && (Ja || ma) && hc(L - V, ga - ba)) ua || (ua = aa.rect(V, ba, Oa ? 1 : wa, M ? 1 : sa, 0).attr({
                    fill: "rgba(69,114,167,0.25)",
                    zIndex: 7
                  }).add());
                  if (ua && Oa) {
                    N = N - L;
                    ua.attr({
                      width: cb(N),
                      x: (N > 0 ? 0 : N) + L
                    })
                  }
                  if (ua && M) {
                    Q = Q - ga;
                    ua.attr({
                      height: cb(Q),
                      y: (Q > 0 ? 0 : Q) + ga
                    })
                  }
                }
              }
              else if (!H) {
                var A;
                Q = m.hoverPoint;
                N = m.hoverSeries;
                var D, ha, xa = Xa,
                    va = Ga ? s.chartY : s.chartX - V;
                if (rc && h.shared) {
                  A = [];
                  D = Ba.length;
                  for (ha = 0; ha < D; ha++) if (Ba[ha].visible && Ba[ha].tooltipPoints.length) {
                    s = Ba[ha].tooltipPoints[va];
                    s._dist = cb(va - s.plotX);
                    xa = pb(xa, s._dist);
                    A.push(s)
                  }
                  for (D = A.length; D--;) A[D]._dist > xa && A.splice(D, 1);
                  if (A.length && A[0].plotX != ld) {
                    rc.refresh(A);
                    ld = A[0].plotX
                  }
                }
                if (N && N.tracker)(s = N.tooltipPoints[va]) && s != Q && s.onMouseOver()
              }
              return (E = H) || !ic
            }
            };
        ta.onmousemove = ea;
        Qa(ta, "mouseleave", O);
        ta.ontouchstart = function (s) {
          if (Ja || ma) ta.onmousedown(s);
          ea(s)
        };
        ta.ontouchmove = ea;
        ta.ontouchend = function () {
          Ea && O()
        };
        ta.onclick = function (s) {
          var N = m.hoverPoint;
          s = x(s);
          s.cancelBubble = true;
          if (!Ea) if (N && za(s.target, "isTracker")) {
            var Q = N.plotX,
                H = N.plotY;
            qa(N, {
              pageX: qc.left + V + (Ga ? wa - H : Q),
              pageY: qc.top + ba + (Ga ? sa - Q : H)
            });
            La(N.series, "click", qa(s, {
              point: N
            }));
            N.firePointEvent("click", s)
          }
          else {
            qa(s, w(s));
            hc(s.chartX - V, s.chartY - ba) && La(m, "click", s)
          }
          Ea = false
        }
      })();
      Nd = setInterval(function () {
        kd && kd()
      }, 32);
      qa(this, {
        zoomX: Ja,
        zoomY: ma,
        resetTracker: O
      })
    }
    function g(m) {
      var h = m.type || v.type || v.defaultSeriesType,
          x = ub[h],
          w = q.hasRendered;
      if (w) if (Ga && h == "column") x = ub.bar;
      else if (!Ga && h == "bar") x = ub.column;
      h = new x;
      h.init(q, m);
      if (!w && h.inverted) Ga = true;
      if (h.isCartesian) ic = h.isCartesian;
      Ba.push(h);
      return h
    }
    function i() {
      v.alignTicks !== false && t(ab, function (m) {
        m.adjustTickAmount()
      });
      Gb = null
    }
    function k(m) {
      var h = q.isDirtyLegend,
          x, w = q.isDirtyBox,
          O = Ba.length,
          ja = O,
          L = q.clipRect;
      for (bc(m, q); ja--;) {
        m = Ba[ja];
        if (m.isDirty && m.options.stacking) {
          x = true;
          break
        }
      }
      if (x) for (ja = O; ja--;) {
        m = Ba[ja];
        if (m.options.stacking) m.isDirty = true
      }
      t(Ba, function (ga) {
        if (ga.isDirty) {
          ga.cleanData();
          ga.getSegments();
          if (ga.options.legendType == "point") h = true
        }
      });
      if (h && od.renderLegend) {
        od.renderLegend();
        q.isDirtyLegend = false
      }
      if (ic) {
        if (!Rc) {
          Gb = null;
          t(ab, function (ga) {
            ga.setScale()
          })
        }
        i();
        sc();
        t(ab, function (ga) {
          if (ga.isDirty || w) {
            ga.redraw();
            w = true
          }
        })
      }
      if (w) {
        pd();
        Pc();
        if (L) {
          Sc(L);
          L.animate({
            width: q.plotSizeX,
            height: q.plotSizeY
          })
        }
      }
      t(Ba, function (ga) {
        if (ga.isDirty && ga.visible && (!ga.isCartesian || ga.xAxis)) ga.redraw()
      });
      gc && gc.resetTracker && gc.resetTracker();
      La(q, "redraw")
    }
    function j() {
      var m = a.xAxis || {},
          h = a.yAxis || {},
          x;
      m = nc(m);
      t(m, function (w, O) {
        w.index = O;
        w.isX = true
      });
      h = nc(h);
      t(h, function (w, O) {
        w.index = O
      });
      ab = m.concat(h);
      q.xAxis = [];
      q.yAxis = [];
      ab = jc(ab, function (w) {
        x = new c(q, w);
        q[x.isXAxis ? "xAxis" : "yAxis"].push(x);
        return x
      });
      i()
    }

    function n(m, h) {
      kc = ya(a.title, m);
      tc = ya(a.subtitle, h);
      t([
        ["title", m, kc],
        ["subtitle", h, tc]
      ], function (x) {
        var w = x[0],
            O = q[w],
            ja = x[1];
        x = x[2];
        if (O && ja) {
          O.destroy();
          O = null
        }
        if (x && x.text && !O) q[w] = aa.text(x.text, 0, 0).attr({
          align: x.align,
          "class": "highcharts-" + w,
          zIndex: 1
        }).css(x.style).add().align(x, false, uc)
      })
    }
    function z() {
      jb = v.renderTo;
      Od = Zb + qd++;
      if (Kb(jb)) jb = Aa.getElementById(jb);
      jb.innerHTML = "";
      if (!jb.offsetWidth) {
        Qb = jb.cloneNode(0);
        Ia(Qb, {
          position: lc,
          top: "-9999px",
          display: ""
        });
        Aa.body.appendChild(Qb)
      }
      Tc = (Qb || jb).offsetWidth;
      vc = (Qb || jb).offsetHeight;
      q.chartWidth = Xa = v.width || Tc || 600;
      q.chartHeight = Pa = v.height || (vc > 19 ? vc : 400);
      q.container = ta = fb(Lb, {
        className: "highcharts-container" + (v.className ? " " + v.className : ""),
        id: Od
      }, qa({
        position: Pd,
        overflow: vb,
        width: Xa + $a,
        height: Pa + $a,
        textAlign: "left"
      }, v.style), Qb || jb);
      q.renderer = aa = v.forExport ? new Uc(ta, Xa, Pa, true) : new Qd(ta, Xa, Pa);
      var m, h;
      if (Rd && ta.getBoundingClientRect) {
        m = function () {
          Ia(ta, {
            left: 0,
            top: 0
          });
          h = ta.getBoundingClientRect();
          Ia(ta, {
            left: -h.left % 1 + $a,
            top: -h.top % 1 + $a
          })
        };
        m();
        Qa(ib, "resize", m);
        Qa(q, "destroy", function () {
          Cb(ib, "resize", m)
        })
      }
    }
    function F() {
      function m() {
        var x = v.width || jb.offsetWidth,
            w = v.height || jb.offsetHeight;
        if (x && w) {
          if (x != Tc || w != vc) {
            clearTimeout(h);
            h = setTimeout(function () {
              rd(x, w, false)
            }, 100)
          }
          Tc = x;
          vc = w
        }
      }
      var h;
      Qa(window, "resize", m);
      Qa(q, "destroy", function () {
        Cb(window, "resize", m)
      })
    }
    function W() {
      var m = a.labels,
          h = a.credits,
          x;
      n();
      od = q.legend = new be(q);
      sc();
      t(ab, function (w) {
        w.setTickPositions(true)
      });
      i();
      sc();
      pd();
      ic && t(ab, function (w) {
        w.render()
      });
      if (!q.seriesGroup) q.seriesGroup = aa.g("series-group").attr({
        zIndex: 3
      }).add();
      t(Ba, function (w) {
        w.translate();
        w.setTooltipPoints();
        w.render()
      });
      m.items && t(m.items, function () {
        var w = qa(m.style, this.style),
            O = oa(w.left) + V,
            ja = oa(w.top) + ba + 12;
        delete w.left;
        delete w.top;
        aa.text(this.html, O, ja).attr({
          zIndex: 2
        }).css(w).add()
      });
      if (!q.toolbar) q.toolbar = d(q);
      if (h.enabled && !q.credits) {
        x = h.href;
        aa.text(h.text, 0, 0).on("click", function () {
          if (x) location.href = x
        }).attr({
          align: h.position.align,
          zIndex: 8
        }).css(h.style).add().align(h.position)
      }
      Pc();
      q.hasRendered = true;
      if (Qb) {
        jb.appendChild(ta);
        Fc(Qb)
      }
    }
    function ca() {
      var m = Ba.length,
          h = ta && ta.parentNode;
      La(q, "destroy");
      Cb(ib, "unload", ca);
      Cb(q);
      for (t(ab, function (x) {
        Cb(x)
      }); m--;) Ba[m].destroy();
      if (ta) {
        ta.innerHTML = "";
        Cb(ta);
        h && h.removeChild(ta);
        ta = null
      }
      if (aa) aa.alignedObjects = null;
      clearInterval(Nd);
      for (m in q) delete q[m]
    }
    function ka() {
      if (!wc && ib == ib.top && Aa.readyState != "complete") Aa.attachEvent("onreadystatechange", function () {
        Aa.detachEvent("onreadystatechange", ka);
        ka()
      });
      else {
        z();
        sd();
        td();
        t(a.series || [], function (m) {
          g(m)
        });
        q.inverted = Ga = y(Ga, a.chart.inverted);
        j();
        q.render = W;
        q.tracker = gc = new f(q, a.tooltip);
        W();
        La(q, "load");
        b && b.apply(q, [q]);
        t(q.callbacks, function (m) {
          m.apply(q, [q])
        })
      }
    }
    Lc = ya(Lc, Sa.xAxis);
    hd = ya(hd, Sa.yAxis);
    Sa.xAxis = Sa.yAxis = null;
    a = ya(Sa, a);
    var v = a.chart,
        I = v.margin;
    I = Eb(I) ? I : [I, I, I, I];
    var da = y(v.marginTop, I[0]),
        X = y(v.marginRight, I[1]),
        U = y(v.marginBottom, I[2]),
        R = y(v.marginLeft, I[3]),
        Ha = v.spacingTop,
        Ya = v.spacingRight,
        ud = v.spacingBottom,
        Vc = v.spacingLeft,
        uc, kc, tc, ba, Ab, rb, V, Pb, jb, Qb, ta, Od, Tc, vc, Xa, Pa, jd, Oc, Wc, vd, wd, Xc, q = this,
        ae = (I = v.events) && !! I.click,
        xd, hc, rc, nd, $b, Sd, yd, sa, wa, gc, Qc, Pc, od, Rb, Sb, qc, ic = v.showAxes,
        Rc = 0,
        ab = [],
        Gb, Ba = [],
        Ga, aa, kd, Nd, ld, pd, sc, sd, td, rd, md, Td, be = function (m) {
        function h(u, Z) {
          var pa = u.legendItem,
              Na = u.legendLine,
              P = u.legendSymbol,
              K = M.color,
              gb = Z ? L.itemStyle.color : K;
          K = Z ? u.color : K;
          pa && pa.css({
            fill: gb
          });
          Na && Na.attr({
            stroke: K
          });
          P && P.attr({
            stroke: K,
            fill: K
          })
        }
        function x(u, Z, pa) {
          var Na = u.legendItem,
              P = u.legendLine,
              K = u.legendSymbol;
          u = u.checkbox;
          Na && Na.attr({
            x: Z,
            y: pa
          });
          P && P.translate(Z, pa - 4);
          K && K.attr({
            x: Z + K.xOff,
            y: pa + K.yOff
          });
          if (u) {
            u.x = Z;
            u.y = pa
          }
        }
        function w() {
          t(bb, function (u) {
            var Z = u.checkbox;
            Z && Ia(Z, {
              left: Ka.attr("translateX") + u.legendItemWidth + Z.x - 40 + $a,
              top: Ka.attr("translateY") + Z.y - 11 + $a
            })
          })
        }
        function O(u) {
          var Z, pa, Na, P, K, gb = u.legendItem;
          P = u.series || u;
          if (!gb) {
            K = /^(bar|pie|area|column)$/.test(P.type);
            u.legendItem = gb = aa.text(L.labelFormatter.call(u), 0, 0).css(u.visible ? ma : M).on("mouseover", function () {
              u.setState(yb);
              gb.css(Oa)
            }).on("mouseout", function () {
              gb.css(u.visible ? ma : M);
              u.setState()
            }).on("click", function () {
              var Vb = function () {
                  u.setVisible()
                  };
              u.firePointEvent ? u.firePointEvent("legendItemClick", null, Vb) : La(u, "legendItemClick", null, Vb)
            }).attr({
              zIndex: 2
            }).add(Ka);
            if (!K && u.options && u.options.lineWidth) {
              var cc = u.options;
              P = {
                "stroke-width": cc.lineWidth,
                zIndex: 2
              };
              if (cc.dashStyle) P.dashstyle = cc.dashStyle;
              u.legendLine = aa.path([Za, -Ea - ua, 0, Da, -ua, 0]).attr(P).add(Ka)
            }
            if (K) Z = aa.rect(pa = -Ea - ua, Na = -11, Ea, 12, 2).attr({
              "stroke-width": 0,
              zIndex: 3
            }).add(Ka);
            else if (u.options && u.options.marker && u.options.marker.enabled) Z = aa.symbol(u.symbol, pa = -Ea / 2 - ua, Na = -4, u.options.marker.radius).attr(u.pointAttr[db]).attr({
              zIndex: 3
            }).add(Ka);
            if (Z) {
              Z.xOff = pa;
              Z.yOff = Na
            }
            u.legendSymbol = Z;
            h(u, u.visible);
            if (u.options && u.options.showCheckbox) {
              u.checkbox = fb("input", {
                type: "checkbox",
                checked: u.selected,
                defaultChecked: u.selected
              }, L.itemCheckboxStyle, ta);
              Qa(u.checkbox, "click", function (Vb) {
                La(u, "checkboxClick", {
                  checked: Vb.target.checked
                }, function () {
                  u.select()
                })
              })
            }
          }
          Z = gb.getBBox();
          pa = u.legendItemWidth = L.itemWidth || Ea + ua + Z.width + ea;
          D = Z.height;
          if (ga && Q - N + pa > (Hb || Xa - 2 * E - N)) {
            Q = N;
            H += D
          }
          A = H;
          x(u, Q, H);
          if (ga) Q += pa;
          else H += D;
          tb = Hb || Ca(ga ? Q - N : pa, tb);
          bb.push(u)
        }
        function ja() {
          Q = N;
          H = s;
          A = tb = 0;
          bb = [];
          Ka || (Ka = aa.g("legend").attr({
            zIndex: 7
          }).add());
          Ta && Fa.reverse();
          t(Fa, function (Na) {
            if (Na.options.showInLegend) t(Na.options.legendType == "point" ? Na.data : [Na], O)
          });
          Ta && Fa.reverse();
          Rb = Hb || tb;
          Sb = A - s + D;
          if (xa || va) {
            Rb += 2 * E;
            Sb += 2 * E;
            if (ha) Rb > 0 && Sb > 0 && ha.animate(ha.crisp(null, null, null, Rb, Sb));
            else ha = aa.rect(0, 0, Rb, Sb, L.borderRadius, xa || 0).attr({
              stroke: L.borderColor,
              "stroke-width": xa || 0,
              fill: va || nb
            }).add(Ka).shadow(L.shadow);
            ha[bb.length ? "show" : "hide"]()
          }
          for (var u = ["left", "right", "top", "bottom"], Z, pa = 4; pa--;) {
            Z = u[pa];
            if (Ja[Z] && Ja[Z] != "auto") {
              L[pa < 2 ? "align" : "verticalAlign"] = Z;
              L[pa < 2 ? "x" : "y"] = oa(Ja[Z]) * (pa % 2 ? -1 : 1)
            }
          }
          Ka.align(qa(L, {
            width: Rb,
            height: Sb
          }), true, uc);
          Rc || w()
        }
        var L = m.options.legend;
        if (L.enabled) {
          var ga = L.layout == "horizontal",
              Ea = L.symbolWidth,
              ua = L.symbolPadding,
              bb, Ja = L.style,
              ma = L.itemStyle,
              Oa = L.itemHoverStyle,
              M = L.itemHiddenStyle,
              E = oa(Ja.padding),
              ea = 20,
              s = 18,
              N = 4 + E + Ea + ua,
              Q, H, A, D = 0,
              ha, xa = L.borderWidth,
              va = L.backgroundColor,
              Ka, tb, Hb = L.width,
              Fa = m.series,
              Ta = L.reversed;
          ja();
          Qa(m, "endResize", w);
          return {
            colorizeItem: h,
            destroyItem: function (u) {
              var Z = u.checkbox;
              t(["legendItem", "legendLine", "legendSymbol"], function (pa) {
                u[pa] && u[pa].destroy()
              });
              Z && Fc(u.checkbox)
            },
            renderLegend: ja
          }
        }
        };
    hc = function (m, h) {
      return m >= 0 && m <= wa && h >= 0 && h <= sa
    };
    Td = function () {
      La(q, "selection", {
        resetSelection: true
      }, md);
      q.toolbar.remove("zoom")
    };
    md = function (m) {
      var h = Sa.lang,
          x = q.pointCount < 100;
      q.toolbar.add("zoom", h.resetZoom, h.resetZoomTitle, Td);
      !m || m.resetSelection ? t(ab, function (w) {
        w.setExtremes(null, null, false, x)
      }) : t(m.xAxis.concat(m.yAxis), function (w) {
        var O = w.axis;
        if (q.tracker[O.isXAxis ? "zoomX" : "zoomY"]) O.setExtremes(w.min, w.max, false, x)
      });
      k()
    };
    sc = function () {
      var m = a.legend,
          h = y(m.margin, 10),
          x = m.x,
          w = m.y,
          O = m.align,
          ja = m.verticalAlign,
          L;
      sd();
      if ((q.title || q.subtitle) && !J(da)) if (L = Ca(q.title && !kc.floating && !kc.verticalAlign && kc.y || 0, q.subtitle && !tc.floating && !tc.verticalAlign && tc.y || 0)) ba = Ca(ba, L + y(kc.margin, 15) + Ha);
      if (m.enabled && !m.floating) if (O == "right") J(X) || (Ab = Ca(Ab, Rb - x + h + Ya));
      else if (O == "left") J(R) || (V = Ca(V, Rb + x + h + Vc));
      else if (ja == "top") J(da) || (ba = Ca(ba, Sb + w + h + Ha));
      else if (ja == "bottom") J(U) || (rb = Ca(rb, Sb - w + h + ud));
      ic && t(ab, function (ga) {
        ga.getOffset()
      });
      J(R) || (V += Pb[3]);
      J(da) || (ba += Pb[0]);
      J(U) || (rb += Pb[2]);
      J(X) || (Ab += Pb[1]);
      td()
    };
    rd = function (m, h, x) {
      var w = q.title,
          O = q.subtitle;
      Rc += 1;
      bc(x, q);
      Oc = Pa;
      jd = Xa;
      Xa = fa(m);
      Pa = fa(h);
      Ia(ta, {
        width: Xa + $a,
        height: Pa + $a
      });
      aa.setSize(Xa, Pa, x);
      wa = Xa - V - Ab;
      sa = Pa - ba - rb;
      Gb = null;
      t(ab, function (ja) {
        ja.isDirty = true;
        ja.setScale()
      });
      t(Ba, function (ja) {
        ja.isDirty = true
      });
      q.isDirtyLegend = true;
      q.isDirtyBox = true;
      sc();
      w && w.align(null, null, uc);
      O && O.align(null, null, uc);
      k(x);
      Oc = null;
      La(q, "resize");
      setTimeout(function () {
        La(q, "endResize", null, function () {
          Rc -= 1
        })
      }, Bc && Bc.duration || 500)
    };
    td = function () {
      q.plotLeft = V = fa(V);
      q.plotTop = ba = fa(ba);
      q.plotWidth = wa = fa(Xa - V - Ab);
      q.plotHeight = sa = fa(Pa - ba - rb);
      q.plotSizeX = Ga ? sa : wa;
      q.plotSizeY = Ga ? wa : sa;
      uc = {
        x: Vc,
        y: Ha,
        width: Xa - Vc - Ya,
        height: Pa - Ha - ud
      }
    };
    sd = function () {
      ba = y(da, Ha);
      Ab = y(X, Ya);
      rb = y(U, ud);
      V = y(R, Vc);
      Pb = [0, 0, 0, 0]
    };
    pd = function () {
      var m = v.borderWidth || 0,
          h = v.backgroundColor,
          x = v.plotBackgroundColor,
          w = v.plotBackgroundImage,
          O, ja = {
          x: V,
          y: ba,
          width: wa,
          height: sa
          };
      O = m + (v.shadow ? 8 : 0);
      if (m || h) if (Wc) Wc.animate(Wc.crisp(null, null, null, Xa - O, Pa - O));
      else Wc = aa.rect(O / 2, O / 2, Xa - O, Pa - O, v.borderRadius, m).attr({
        stroke: v.borderColor,
        "stroke-width": m,
        fill: h || nb
      }).add().shadow(v.shadow);
      if (x) if (vd) vd.animate(ja);
      else vd = aa.rect(V, ba, wa, sa, 0).attr({
        fill: x
      }).add().shadow(v.plotShadow);
      if (w) if (wd) wd.animate(ja);
      else wd = aa.image(w, V, ba, wa, sa).add();
      if (v.plotBorderWidth) if (Xc) Xc.animate(Xc.crisp(null, V, ba, wa, sa));
      else Xc = aa.rect(V, ba, wa, sa, 0, v.plotBorderWidth).attr({
        stroke: v.plotBorderColor,
        "stroke-width": v.plotBorderWidth,
        zIndex: 4
      }).add();
      q.isDirtyBox = false
    };
    Yc = Jb = 0;
    Qa(ib, "unload", ca);
    v.reflow !== false && Qa(q, "load", F);
    if (I) for (xd in I) Qa(q, xd, I[xd]);
    q.options = a;
    q.series = Ba;
    q.addSeries = function (m, h, x) {
      var w;
      if (m) {
        bc(x, q);
        h = y(h, true);
        La(q, "addSeries", {
          options: m
        }, function () {
          w = g(m);
          w.isDirty = true;
          q.isDirtyLegend = true;
          h && q.redraw()
        })
      }
      return w
    };
    q.animation = y(v.animation, true);
    q.destroy = ca;
    q.get = function (m) {
      var h, x, w;
      for (h = 0; h < ab.length; h++) if (ab[h].options.id == m) return ab[h];
      for (h = 0; h < Ba.length; h++) if (Ba[h].options.id == m) return Ba[h];
      for (h = 0; h < Ba.length; h++) {
        w = Ba[h].data;
        for (x = 0; x < w.length; x++) if (w[x].id == m) return w[x]
      }
      return null
    };
    q.getSelectedPoints = function () {
      var m = [];
      t(Ba, function (h) {
        m = m.concat(zd(h.data, function (x) {
          return x.selected
        }))
      });
      return m
    };
    q.getSelectedSeries = function () {
      return zd(Ba, function (m) {
        return m.selected
      })
    };
    q.hideLoading = function () {
      Zc($b, {
        opacity: 0
      }, {
        duration: a.loading.hideDuration,
        complete: function () {
          Ia($b, {
            display: nb
          })
        }
      });
      yd = false
    };
    q.isInsidePlot = hc;
    q.redraw = k;
    q.setSize = rd;
    q.setTitle = n;
    q.showLoading = function (m) {
      var h = a.loading;
      if (!$b) {
        $b = fb(Lb, {
          className: "highcharts-loading"
        }, qa(h.style, {
          left: V + $a,
          top: ba + $a,
          width: wa + $a,
          height: sa + $a,
          zIndex: 10,
          display: nb
        }), ta);
        Sd = fb("span", null, h.labelStyle, $b)
      }
      Sd.innerHTML = m || a.lang.loading;
      if (!yd) {
        Ia($b, {
          opacity: 0,
          display: ""
        });
        Zc($b, {
          opacity: h.style.opacity
        }, {
          duration: h.showDuration
        });
        yd = true
      }
    };
    q.pointCount = 0;
    ka()
  }
  var Aa = document,
      ib = window,
      Ua = Math,
      fa = Ua.round,
      ob = Ua.floor,
      fd = Ua.ceil,
      Ca = Ua.max,
      pb = Ua.min,
      cb = Ua.abs,
      kb = Ua.cos,
      zb = Ua.sin,
      Tb = Ua.PI,
      Ud = Tb * 2 / 360,
      xc = navigator.userAgent,
      Ac = /msie/i.test(xc) && !ib.opera,
      yc = Aa.documentMode == 8,
      ce = /AppleWebKit/.test(xc),
      Rd = /Firefox/.test(xc),
      wc = !! Aa.createElementNS && !! Aa.createElementNS("http://www.w3.org/2000/svg", "svg").createSVGRect,
      Ib = "ontouchstart" in Aa.documentElement,
      Jb, Yc, de = {},
      qd = 0,
      qb = 1,
      Gc, Sa, Mc, Bc, $c, Ra, Lb = "div",
      lc = "absolute",
      Pd = "relative",
      vb = "hidden",
      Zb = "highcharts-",
      Bb = "visible",
      $a = "px",
      nb = "none",
      Za = "M",
      Da = "L",
      Vd = "rgba(192,192,192," + (wc ? 1.0E-6 : 0.0020) + ")",
      db = "",
      yb = "hover",
      Cc, bd, cd, dd, oc, Dc, Ec, Cd, Dd, ed, Ed, Fd, eb = ib.HighchartsAdapter,
      Db = eb || {},
      t = Db.each,
      zd = Db.grep,
      jc = Db.map,
      ya = Db.merge,
      Ad = Db.hyphenate,
      Qa = Db.addEvent,
      Cb = Db.removeEvent,
      La = Db.fireEvent,
      Zc = Db.animate,
      Sc = Db.stop,
      ub = {};
  eb && eb.init && eb.init();
  if (!eb && ib.jQuery) {
    var lb = jQuery;
    t = function (a, b) {
      for (var c = 0, d = a.length; c < d; c++) if (b.call(a[c], a[c], c, a) === false) return c
    };
    zd = lb.grep;
    jc = function (a, b) {
      for (var c = [], d = 0, e = a.length; d < e; d++) c[d] = b.call(a[d], a[d], d, a);
      return c
    };
    ya = function () {
      var a = arguments;
      return lb.extend(true, null, a[0], a[1], a[2], a[3])
    };
    Ad = function (a) {
      return a.replace(/([A-Z])/g, function (b, c) {
        return "-" + c.toLowerCase()
      })
    };
    Qa = function (a, b, c) {
      lb(a).bind(b, c)
    };
    Cb = function (a, b, c) {
      var d = Aa.removeEventListener ? "removeEventListener" : "detachEvent";
      if (Aa[d] && !a[d]) a[d] = function () {};
      lb(a).unbind(b, c)
    };
    La = function (a, b, c, d) {
      var e = lb.Event(b),
          f = "detached" + b;
      qa(e, c);
      if (a[b]) {
        a[f] = a[b];
        a[b] = null
      }
      lb(a).trigger(e);
      if (a[f]) {
        a[b] = a[f];
        a[f] = null
      }
      d && !e.isDefaultPrevented() && d(e)
    };
    Zc = function (a, b, c) {
      var d = lb(a);
      if (b.d) {
        a.toD = b.d;
        b.d = 1
      }
      d.stop();
      d.animate(b, c)
    };
    Sc = function (a) {
      lb(a).stop()
    };
    lb.extend(lb.easing, {
      easeOutQuad: function (a, b, c, d, e) {
        return -d * (b /= e) * (b - 2) + c
      }
    });
    var ee = jQuery.fx.step._default,
        fe = jQuery.fx.prototype.cur;
    lb.fx.step._default = function (a) {
      var b = a.elem;
      b.attr ? b.attr(a.prop, a.now) : ee.apply(this, arguments)
    };
    lb.fx.step.d = function (a) {
      var b = a.elem;
      if (!a.started) {
        var c = $c.init(b, b.d, b.toD);
        a.start = c[0];
        a.end = c[1];
        a.started = true
      }
      b.attr("d", $c.step(a.start, a.end, a.pos, b.toD))
    };
    lb.fx.prototype.cur = function () {
      var a = this.elem;
      return a.attr ? a.attr(this.prop) : fe.apply(this, arguments)
    }
  }
  $c = {
    init: function (a, b, c) {
      b = b || "";
      var d = a.shift,
          e = b.indexOf("C") > -1,
          f = e ? 7 : 3,
          g;
      b = b.split(" ");
      c = [].concat(c);
      var i, k, j = function (n) {
          for (g = n.length; g--;) n[g] == Za && n.splice(g + 1, 0, n[g + 1], n[g + 2], n[g + 1], n[g + 2])
          };
      if (e) {
        j(b);
        j(c)
      }
      if (a.isArea) {
        i = b.splice(b.length - 6, 6);
        k = c.splice(c.length - 6, 6)
      }
      if (d) {
        c = [].concat(c).splice(0, f).concat(c);
        a.shift = false
      }
      if (b.length) for (a = c.length; b.length < a;) {
        d = [].concat(b).splice(b.length - f, f);
        if (e) {
          d[f - 6] = d[f - 2];
          d[f - 5] = d[f - 1]
        }
        b = b.concat(d)
      }
      if (i) {
        b = b.concat(i);
        c = c.concat(k)
      }
      return [b, c]
    },
    step: function (a, b, c, d) {
      var e = [],
          f = a.length;
      if (c == 1) e = d;
      else if (f == b.length && c < 1) for (; f--;) {
        d = parseFloat(a[f]);
        e[f] = isNaN(d) ? a[f] : c * parseFloat(b[f] - d) + d
      }
      else e = b;
      return e
    }
  };
  eb = {
    enabled: true,
    align: "center",
    x: 0,
    y: 15,
    style: {
      color: "#666",
      fontSize: "11px",
      lineHeight: "14px"
    }
  };
  Sa = {
    colors: ["#4572A7", "#AA4643", "#89A54E", "#80699B", "#3D96AE", "#DB843D", "#92A8CD", "#A47D7C", "#B5CA92"],
    symbols: ["circle", "diamond", "square", "triangle", "triangle-down"],
    lang: {
      loading: "Loading...",
      months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
      weekdays: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
      decimalPoint: ".",
      resetZoom: "Reset zoom",
      resetZoomTitle: "Reset zoom level 1:1",
      thousandsSep: ","
    },
    global: {
      useUTC: true
    },
    chart: {
      borderColor: "#4572A7",
      borderRadius: 5,
      defaultSeriesType: "line",
      ignoreHiddenSeries: true,
      spacingTop: 10,
      spacingRight: 10,
      spacingBottom: 15,
      spacingLeft: 10,
      style: {
        fontFamily: '"Lucida Grande", "Lucida Sans Unicode", Verdana, Arial, Helvetica, sans-serif',
        fontSize: "12px"
      },
      backgroundColor: "#FFFFFF",
      plotBorderColor: "#C0C0C0"
    },
    title: {
      text: "Chart title",
      align: "center",
      y: 15,
      style: {
        color: "#3E576F",
        fontSize: "16px"
      }
    },
    subtitle: {
      text: "",
      align: "center",
      y: 30,
      style: {
        color: "#6D869F"
      }
    },
    plotOptions: {
      line: {
        allowPointSelect: false,
        showCheckbox: false,
        animation: {
          duration: 1E3
        },
        events: {},
        lineWidth: 2,
        shadow: true,
        marker: {
          enabled: true,
          lineWidth: 0,
          radius: 4,
          lineColor: "#FFFFFF",
          states: {
            hover: {},
            select: {
              fillColor: "#FFFFFF",
              lineColor: "#000000",
              lineWidth: 2
            }
          }
        },
        point: {
          events: {}
        },
        dataLabels: ya(eb, {
          enabled: false,
          y: -6,
          formatter: function () {
            return this.y
          }
        }),
        showInLegend: true,
        states: {
          hover: {
            marker: {}
          },
          select: {
            marker: {}
          }
        },
        stickyTracking: true
      }
    },
    labels: {
      style: {
        position: lc,
        color: "#3E576F"
      }
    },
    legend: {
      enabled: true,
      align: "center",
      layout: "horizontal",
      labelFormatter: function () {
        return this.name
      },
      borderWidth: 1,
      borderColor: "#909090",
      borderRadius: 5,
      shadow: false,
      style: {
        padding: "5px"
      },
      itemStyle: {
        cursor: "pointer",
        color: "#3E576F"
      },
      itemHoverStyle: {
        cursor: "pointer",
        color: "#000000"
      },
      itemHiddenStyle: {
        color: "#C0C0C0"
      },
      itemCheckboxStyle: {
        position: lc,
        width: "13px",
        height: "13px"
      },
      symbolWidth: 16,
      symbolPadding: 5,
      verticalAlign: "bottom",
      x: 0,
      y: 0
    },
    loading: {
      hideDuration: 100,
      labelStyle: {
        fontWeight: "bold",
        position: Pd,
        top: "1em"
      },
      showDuration: 100,
      style: {
        position: lc,
        backgroundColor: "white",
        opacity: 0.5,
        textAlign: "center"
      }
    },
    tooltip: {
      enabled: true,
      backgroundColor: "rgba(255, 255, 255, .85)",
      borderWidth: 2,
      borderRadius: 5,
      shadow: true,
      snap: Ib ? 25 : 10,
      style: {
        color: "#333333",
        fontSize: "12px",
        padding: "5px",
        whiteSpace: "nowrap"
      }
    },
    toolbar: {
      itemStyle: {
        color: "#4572A7",
        cursor: "pointer"
      }
    },
    credits: {
      enabled: false,
      text: "",
      href: "#",
      position: {
        align: "right",
        x: -10,
        verticalAlign: "bottom",
        y: -5
      },
      style: {
        cursor: "pointer",
        color: "#909090",
        fontSize: "10px"
      }
    }
  };
  var Lc = {
    dateTimeLabelFormats: {
      second: "%H:%M:%S",
      minute: "%H:%M",
      hour: "%H:%M",
      day: "%e. %b",
      week: "%e. %b",
      month: "%b '%y",
      year: "%Y"
    },
    endOnTick: false,
    gridLineColor: "#C0C0C0",
    labels: eb,
    lineColor: "#C0D0E0",
    lineWidth: 1,
    max: null,
    min: null,
    minPadding: 0.01,
    maxPadding: 0.01,
    minorGridLineColor: "#E0E0E0",
    minorGridLineWidth: 1,
    minorTickColor: "#A0A0A0",
    minorTickLength: 2,
    minorTickPosition: "outside",
    startOfWeek: 1,
    startOnTick: false,
    tickColor: "#C0D0E0",
    tickLength: 5,
    tickmarkPlacement: "between",
    tickPixelInterval: 100,
    tickPosition: "outside",
    tickWidth: 1,
    title: {
      align: "middle",
      style: {
        color: "#6D869F",
        fontWeight: "bold"
      }
    },
    type: "linear"
  },
      hd = ya(Lc, {
      endOnTick: true,
      gridLineWidth: 1,
      tickPixelInterval: 72,
      showLastLabel: true,
      labels: {
        align: "right",
        x: -8,
        y: 3
      },
      lineWidth: 0,
      maxPadding: 0.05,
      minPadding: 0.05,
      startOnTick: true,
      tickWidth: 0,
      title: {
        rotation: 270,
        text: "Y-values"
      }
    }),
      Zd = {
      labels: {
        align: "right",
        x: -8,
        y: null
      },
      title: {
        rotation: 270
      }
      },
      Yd = {
      labels: {
        align: "left",
        x: 8,
        y: null
      },
      title: {
        rotation: 90
      }
      },
      Ld = {
      labels: {
        align: "center",
        x: 0,
        y: 14
      },
      title: {
        rotation: 0
      }
      },
      Xd = ya(Ld, {
      labels: {
        y: -5
      }
    }),
      wb = Sa.plotOptions;
  eb = wb.line;
  wb.spline = ya(eb);
  wb.scatter = ya(eb, {
    lineWidth: 0,
    states: {
      hover: {
        lineWidth: 0
      }
    }
  });
  wb.area = ya(eb, {});
  wb.areaspline = ya(wb.area);
  wb.column = ya(eb, {
    borderColor: "#FFFFFF",
    borderWidth: 1,
    borderRadius: 0,
    groupPadding: 0.2,
    marker: null,
    pointPadding: 0.1,
    minPointLength: 0,
    states: {
      hover: {
        brightness: 0.1,
        shadow: false
      },
      select: {
        color: "#C0C0C0",
        borderColor: "#000000",
        shadow: false
      }
    }
  });
  wb.bar = ya(wb.column, {
    dataLabels: {
      align: "left",
      x: 5,
      y: 0
    }
  });
  wb.pie = ya(eb, {
    borderColor: "#FFFFFF",
    borderWidth: 1,
    center: ["50%", "50%"],
    colorByPoint: true,
    dataLabels: {
      distance: 30,
      enabled: true,
      formatter: function () {
        return this.point.name
      },
      y: 5
    },
    legendType: "point",
    marker: null,
    size: "75%",
    showInLegend: false,
    slicedOffset: 10,
    states: {
      hover: {
        brightness: 0.1,
        shadow: false
      }
    }
  });
  Bd();
  var Ub = function (a) {
      var b = [],
          c;
      (function (d) {
        if (c = /rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]?(?:\.[0-9]+)?)\s*\)/.exec(d)) b = [oa(c[1]), oa(c[2]), oa(c[3]), parseFloat(c[4], 10)];
        else if (c = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(d)) b = [oa(c[1], 16), oa(c[2], 16), oa(c[3], 16), 1]
      })(a);
      return {
        get: function (d) {
          return b && !isNaN(b[0]) ? d == "rgb" ? "rgb(" + b[0] + "," + b[1] + "," + b[2] + ")" : d == "a" ? b[3] : "rgba(" + b.join(",") + ")" : a
        },
        brighten: function (d) {
          if (ac(d) && d !== 0) {
            var e;
            for (e = 0; e < 3; e++) {
              b[e] += oa(d * 255);
              if (b[e] < 0) b[e] = 0;
              if (b[e] > 255) b[e] = 255
            }
          }
          return this
        },
        setOpacity: function (d) {
          b[3] = d;
          return this
        }
      }
      };
  Mc = function (a, b, c) {
    function d(F) {
      return F.toString().replace(/^([0-9])$/, "0$1")
    }
    if (!J(b) || isNaN(b)) return "Invalid date";
    a = y(a, "%Y-%m-%d %H:%M:%S");
    b = new Date(b * qb);
    var e = b[cd](),
        f = b[dd](),
        g = b[oc](),
        i = b[Dc](),
        k = b[Ec](),
        j = Sa.lang,
        n = j.weekdays;
    j = j.months;
    b = {
      a: n[f].substr(0, 3),
      A: n[f],
      d: d(g),
      e: g,
      b: j[i].substr(0, 3),
      B: j[i],
      m: d(i + 1),
      y: k.toString().substr(2, 2),
      Y: k,
      H: d(e),
      I: d(e % 12 || 12),
      l: e % 12 || 12,
      M: d(b[bd]()),
      p: e < 12 ? "AM" : "PM",
      P: e < 12 ? "am" : "pm",
      S: d(b.getSeconds())
    };
    for (var z in b) a = a.replace("%" + z, b[z]);
    return c ? a.substr(0, 1).toUpperCase() + a.substr(1) : a
  };
  Hc.prototype = {
    init: function (a, b) {
      this.element = Aa.createElementNS("http://www.w3.org/2000/svg", b);
      this.renderer = a
    },
    animate: function (a, b, c) {
      if (b = y(b, Bc, true)) {
        b = ya(b);
        if (c) b.complete = c;
        Zc(this, a, b)
      }
      else {
        this.attr(a);
        c && c()
      }
    },
    attr: function (a, b) {
      var c, d, e, f, g = this.element,
          i = g.nodeName,
          k = this.renderer,
          j, n = this.shadows,
          z, F = this;
      if (Kb(a) && J(b)) {
        c = a;
        a = {};
        a[c] = b
      }
      if (Kb(a)) {
        c = a;
        if (i == "circle") c = {
          x: "cx",
          y: "cy"
        }[c] || c;
        else if (c == "strokeWidth") c = "stroke-width";
        F = za(g, c) || this[c] || 0;
        if (c != "d" && c != "visibility") F = parseFloat(F)
      }
      else for (c in a) {
        j = false;
        d = a[c];
        if (c == "d") {
          if (d && d.join) d = d.join(" ");
          if (/(NaN| {2}|^$)/.test(d)) d = "M 0 0";
          this.d = d
        }
        else if (c == "x" && i == "text") {
          for (e = 0; e < g.childNodes.length; e++) {
            f = g.childNodes[e];
            za(f, "x") == za(g, "x") && za(f, "x", d)
          }
          if (this.rotation) za(g, "transform", "rotate(" + this.rotation + " " + d + " " + oa(a.y || za(g, "y")) + ")")
        }
        else if (c == "fill") d = k.color(d, g, c);
        else if (i == "circle" && (c == "x" || c == "y")) c = {
          x: "cx",
          y: "cy"
        }[c] || c;
        else if (c == "translateX" || c == "translateY" || c == "rotation" || c == "verticalAlign") {
          this[c] = d;
          this.updateTransform();
          j = true
        }
        else if (c == "stroke") d = k.color(d, g, c);
        else if (c == "dashstyle") {
          c = "stroke-dasharray";
          if (d) {
            d = d.toLowerCase().replace("shortdashdotdot", "3,1,1,1,1,1,").replace("shortdashdot", "3,1,1,1").replace("shortdot", "1,1,").replace("shortdash", "3,1,").replace("longdash", "8,3,").replace(/dot/g, "1,3,").replace("dash", "4,3,").replace(/,$/, "").split(",");
            for (e = d.length; e--;) d[e] = oa(d[e]) * a["stroke-width"];
            d = d.join(",")
          }
        }
        else if (c == "isTracker") this[c] = d;
        else if (c == "width") d = oa(d);
        else if (c == "align") {
          c = "text-anchor";
          d = {
            left: "start",
            center: "middle",
            right: "end"
          }[d]
        }
        if (c == "strokeWidth") c = "stroke-width";
        if (ce && c == "stroke-width" && d === 0) d = 1.0E-6;
        if (this.symbolName && /^(x|y|r|start|end|innerR)/.test(c)) {
          if (!z) {
            this.symbolAttr(a);
            z = true
          }
          j = true
        }
        if (n && /^(width|height|visibility|x|y|d)$/.test(c)) for (e = n.length; e--;) za(n[e], c, d);
        if (c == "text") {
          this.textStr = d;
          this.added && k.buildText(this)
        }
        else j || za(g, c, d)
      }
      return F
    },
    symbolAttr: function (a) {
      var b = this;
      t(["x", "y", "r", "start", "end", "width", "height", "innerR"], function (c) {
        b[c] = y(a[c], b[c])
      });
      b.attr({
        d: b.renderer.symbols[b.symbolName](b.x, b.y, b.r, {
          start: b.start,
          end: b.end,
          width: b.width,
          height: b.height,
          innerR: b.innerR
        })
      })
    },
    clip: function (a) {
      return this.attr("clip-path", "url(" + this.renderer.url + "#" + a.id + ")")
    },
    crisp: function (a, b, c, d, e) {
      var f, g = {},
          i = {},
          k;
      a = a || this.strokeWidth || 0;
      k = a % 2 / 2;
      i.x = ob(b || this.x || 0) + k;
      i.y = ob(c || this.y || 0) + k;
      i.width = ob((d || this.width || 0) - 2 * k);
      i.height = ob((e || this.height || 0) - 2 * k);
      i.strokeWidth = a;
      for (f in i) if (this[f] != i[f]) this[f] = g[f] = i[f];
      return g
    },
    css: function (a) {
      var b = this.element;
      b = a && a.width && b.nodeName == "text";
      if (a && a.color) a.fill = a.color;
      this.styles = a = qa(this.styles, a);
      if (Ac && !wc) {
        b && delete a.width;
        Ia(this.element, a)
      }
      else this.attr({
        style: Wd(a)
      });
      b && this.added && this.renderer.buildText(this);
      return this
    },
    on: function (a, b) {
      var c = b;
      if (Ib && a == "click") {
        a = "touchstart";
        c = function (d) {
          d.preventDefault();
          b()
        }
      }
      this.element["on" + a] = c;
      return this
    },
    translate: function (a, b) {
      return this.attr({
        translateX: a,
        translateY: b
      })
    },
    invert: function () {
      this.inverted = true;
      this.updateTransform();
      return this
    },
    updateTransform: function () {
      var a = this.translateX || 0,
          b = this.translateY || 0,
          c = this.inverted,
          d = this.rotation,
          e = [];
      if (c) {
        a += this.attr("width");
        b += this.attr("height")
      }
      if (a || b) e.push("translate(" + a + "," + b + ")");
      if (c) e.push("rotate(90) scale(-1,1)");
      else d && e.push("rotate(" + d + " " + this.x + " " + this.y + ")");
      e.length && za(this.element, "transform", e.join(" "))
    },
    toFront: function () {
      var a = this.element;
      a.parentNode.appendChild(a);
      return this
    },
    align: function (a, b, c) {
      if (a) {
        this.alignOptions = a;
        this.alignByTranslate = b;
        c || this.renderer.alignedObjects.push(this)
      }
      else {
        a = this.alignOptions;
        b = this.alignByTranslate
      }
      c = y(c, this.renderer);
      var d = a.align,
          e = a.verticalAlign,
          f = (c.x || 0) + (a.x || 0),
          g = (c.y || 0) + (a.y || 0),
          i = {};
      if (/^(right|center)$/.test(d)) f += (c.width - (a.width || 0)) / {
        right: 1,
        center: 2
      }[d];
      i[b ? "translateX" : "x"] = fa(f);
      if (/^(bottom|middle)$/.test(e)) g += (c.height - (a.height || 0)) / ({
        bottom: 1,
        middle: 2
      }[e] || 1);
      i[b ? "translateY" : "y"] = fa(g);
      this[this.placed ? "animate" : "attr"](i);
      this.placed = true;
      return this
    },
    getBBox: function () {
      var a, b, c, d = this.rotation,
          e = d * Ud;
      try {
        a = qa({}, this.element.getBBox())
      }
      catch (f) {
        a = {
          width: 0,
          height: 0
        }
      }
      b = a.width;
      c = a.height;
      if (d) {
        a.width = cb(c * zb(e)) + cb(b * kb(e));
        a.height = cb(c * kb(e)) + cb(b * zb(e))
      }
      return a
    },
    show: function () {
      return this.attr({
        visibility: Bb
      })
    },
    hide: function () {
      return this.attr({
        visibility: vb
      })
    },
    add: function (a) {
      var b = this.renderer,
          c = a || b,
          d = c.element || b.box,
          e = d.childNodes,
          f = this.element,
          g = za(f, "zIndex");
      this.parentInverted = a && a.inverted;
      this.textStr !== undefined && b.buildText(this);
      if (g) {
        c.handleZ = true;
        g = oa(g)
      }
      if (c.handleZ) for (c = 0; c < e.length; c++) {
        a = e[c];
        b = za(a, "zIndex");
        if (a != f && (oa(b) > g || !J(g) && J(b))) {
          d.insertBefore(f, a);
          return this
        }
      }
      d.appendChild(f);
      this.added = true;
      return this
    },
    destroy: function () {
      var a = this.element || {},
          b = this.shadows,
          c = a.parentNode,
          d;
      a.onclick = a.onmouseout = a.onmouseover = a.onmousemove = null;
      Sc(this);
      c && c.removeChild(a);
      b && t(b, function (e) {
        (c = e.parentNode) && c.removeChild(e)
      });
      mc(this.renderer.alignedObjects, this);
      for (d in this) delete this[d];
      return null
    },
    empty: function () {
      for (var a = this.element, b = a.childNodes, c = b.length; c--;) a.removeChild(b[c])
    },
    shadow: function (a) {
      var b = [],
          c, d = this.element,
          e = this.parentInverted ? "(-1,-1)" : "(1,1)";
      if (a) {
        for (a = 1; a <= 3; a++) {
          c = d.cloneNode(0);
          za(c, {
            isShadow: "true",
            stroke: "rgb(0, 0, 0)",
            "stroke-opacity": 0.05 * a,
            "stroke-width": 7 - 2 * a,
            transform: "translate" + e,
            fill: nb
          });
          d.parentNode.insertBefore(c, d);
          b.push(c)
        }
        this.shadows = b
      }
      return this
    }
  };
  var Uc = function () {
      this.init.apply(this, arguments)
      };
  Uc.prototype = {
    init: function (a, b, c, d) {
      var e = location,
          f;
      this.Element = Hc;
      f = this.createElement("svg").attr({
        xmlns: "http://www.w3.org/2000/svg",
        version: "1.1"
      });
      a.appendChild(f.element);
      this.box = f.element;
      this.boxWrapper = f;
      this.alignedObjects = [];
      this.url = Ac ? "" : e.href.replace(/#.*?$/, "");
      this.defs = this.createElement("defs").add();
      this.forExport = d;
      this.setSize(b, c, false)
    },
    createElement: function (a) {
      var b = new this.Element;
      b.init(this, a);
      return b
    },
    buildText: function (a) {
      for (var b = a.element, c = y(a.textStr, "").toString().replace(/<(b|strong)>/g, '<span style="font-weight:bold">').replace(/<(i|em)>/g, '<span style="font-style:italic">').replace(/<a/g, "<span").replace(/<\/(b|strong|i|em|a)>/g, "</span>").split(/<br[^>]?>/g), d = b.childNodes, e = /style="([^"]+)"/, f = /href="([^"]+)"/, g = za(b, "x"), i = a.styles, k = Rd && i && i.HcDirection == "rtl" && !this.forExport, j, n = i && oa(i.width), z = i && i.lineHeight, F, W = d.length; W--;) b.removeChild(d[W]);
      n && !a.added && this.box.appendChild(b);
      t(c, function (ca, ka) {
        var v, I = 0,
            da;
        ca = ca.replace(/<span/g, "|||<span").replace(/<\/span>/g, "</span>|||");
        v = ca.split("|||");
        t(v, function (X) {
          if (X !== "" || v.length == 1) {
            var U = {},
                R = Aa.createElementNS("http://www.w3.org/2000/svg", "tspan");
            e.test(X) && za(R, "style", X.match(e)[1].replace(/(;| |^)color([ :])/, "$1fill$2"));
            if (f.test(X)) {
              za(R, "onclick", 'location.href="' + X.match(f)[1] + '"');
              Ia(R, {
                cursor: "pointer"
              })
            }
            X = X.replace(/<(.|\n)*?>/g, "") || " ";
            if (k) {
              j = [];
              for (W = X.length; W--;) j.push(X.charAt(W));
              X = j.join("")
            }
            R.appendChild(Aa.createTextNode(X));
            if (I) U.dx = 3;
            else U.x = g;
            if (!I) {
              if (ka) {
                da = oa(window.getComputedStyle(F, null).getPropertyValue("line-height"));
                if (isNaN(da)) da = z || F.offsetHeight || 18;
                za(R, "dy", da)
              }
              F = R
            }
            za(R, U);
            b.appendChild(R);
            I++;
            if (n) {
              X = X.replace(/-/g, "- ").split(" ");
              for (var Ha, Ya = []; X.length || Ya.length;) {
                Ha = b.getBBox().width;
                U = Ha > n;
                if (!U || X.length == 1) {
                  X = Ya;
                  Ya = [];
                  if (X.length) {
                    R = Aa.createElementNS("http://www.w3.org/2000/svg", "tspan");
                    za(R, {
                      x: g,
                      dy: z || 16
                    });
                    b.appendChild(R);
                    if (Ha > n) n = Ha
                  }
                }
                else {
                  R.removeChild(R.firstChild);
                  Ya.unshift(X.pop())
                }
                R.appendChild(Aa.createTextNode(X.join(" ").replace(/- /g, "-")))
              }
            }
          }
        })
      })
    },
    crispLine: function (a, b) {
      if (a[1] == a[4]) a[1] = a[4] = fa(a[1]) + b % 2 / 2;
      if (a[2] == a[5]) a[2] = a[5] = fa(a[2]) + b % 2 / 2;
      return a
    },
    path: function (a) {
      return this.createElement("path").attr({
        d: a,
        fill: nb
      })
    },
    circle: function (a, b, c) {
      a = Eb(a) ? a : {
        x: a,
        y: b,
        r: c
      };
      return this.createElement("circle").attr(a)
    },
    arc: function (a, b, c, d, e, f) {
      if (Eb(a)) {
        b = a.y;
        c = a.r;
        d = a.innerR;
        e = a.start;
        f = a.end;
        a = a.x
      }
      return this.symbol("arc", a || 0, b || 0, c || 0, {
        innerR: d || 0,
        start: e || 0,
        end: f || 0
      })
    },
    rect: function (a, b, c, d, e, f) {
      if (Eb(a)) {
        b = a.y;
        c = a.width;
        d = a.height;
        e = a.r;
        a = a.x
      }
      e = this.createElement("rect").attr({
        rx: e,
        ry: e,
        fill: nb
      });
      return e.attr(e.crisp(f, a, b, Ca(c, 0), Ca(d, 0)))
    },
    setSize: function (a, b, c) {
      var d = this.alignedObjects,
          e = d.length;
      this.width = a;
      this.height = b;
      for (this.boxWrapper[y(c, true) ? "animate" : "attr"]({
        width: a,
        height: b
      }); e--;) d[e].align()
    },
    g: function (a) {
      return this.createElement("g").attr(J(a) && {
        "class": Zb + a
      })
    },
    image: function (a, b, c, d, e) {
      var f = {
        preserveAspectRatio: nb
      };
      arguments.length > 1 && qa(f, {
        x: b,
        y: c,
        width: d,
        height: e
      });
      f = this.createElement("image").attr(f);
      f.element.setAttributeNS("http://www.w3.org/1999/xlink", "href", a);
      return f
    },
    symbol: function (a, b, c, d, e) {
      var f, g = this.symbols[a];
      g = g && g(b, c, d, e);
      var i = /^url\((.*?)\)$/;
      if (g) {
        f = this.path(g);
        qa(f, {
          symbolName: a,
          x: b,
          y: c,
          r: d
        });
        e && qa(f, e)
      }
      else if (i.test(a)) {
        a = a.match(i)[1];
        f = this.image(a).attr({
          x: b,
          y: c
        });
        fb("img", {
          onload: function () {
            var k = de[this.src] || [this.width, this.height];
            f.attr({
              width: k[0],
              height: k[1]
            }).translate(-fa(k[0] / 2), -fa(k[1] / 2))
          },
          src: a
        })
      }
      else f = this.circle(b, c, d);
      return f
    },
    symbols: {
      square: function (a, b, c) {
        c = 0.707 * c;
        return [Za, a - c, b - c, Da, a + c, b - c, a + c, b + c, a - c, b + c, "Z"]
      },
      triangle: function (a, b, c) {
        return [Za, a, b - 1.33 * c, Da, a + c, b + 0.67 * c, a - c, b + 0.67 * c, "Z"]
      },
      "triangle-down": function (a, b, c) {
        return [Za, a, b + 1.33 * c, Da, a - c, b - 0.67 * c, a + c, b - 0.67 * c, "Z"]
      },
      diamond: function (a, b, c) {
        return [Za, a, b - c, Da, a + c, b, a, b + c, a - c, b, "Z"]
      },
      arc: function (a, b, c, d) {
        var e = d.start,
            f = d.end - 1.0E-6,
            g = d.innerR,
            i = kb(e),
            k = zb(e),
            j = kb(f);
        f = zb(f);
        d = d.end - e < Tb ? 0 : 1;
        return [Za, a + c * i, b + c * k, "A", c, c, 0, d, 1, a + c * j, b + c * f, Da, a + g * j, b + g * f, "A", g, g, 0, d, 0, a + g * i, b + g * k, "Z"]
      }
    },
    clipRect: function (a, b, c, d) {
      var e = Zb + qd++,
          f = this.createElement("clipPath").attr({
          id: e
        }).add(this.defs);
      a = this.rect(a, b, c, d, 0).add(f);
      a.id = e;
      return a
    },
    color: function (a, b, c) {
      var d, e = /^rgba/;
      if (a && a.linearGradient) {
        var f = this;
        b = a.linearGradient;
        c = Zb + qd++;
        var g, i, k;
        g = f.createElement("linearGradient").attr({
          id: c,
          gradientUnits: "userSpaceOnUse",
          x1: b[0],
          y1: b[1],
          x2: b[2],
          y2: b[3]
        }).add(f.defs);
        t(a.stops, function (j) {
          if (e.test(j[1])) {
            d = Ub(j[1]);
            i = d.get("rgb");
            k = d.get("a")
          }
          else {
            i = j[1];
            k = 1
          }
          f.createElement("stop").attr({
            offset: j[0],
            "stop-color": i,
            "stop-opacity": k
          }).add(g)
        });
        return "url(" + this.url + "#" + c + ")"
      }
      else if (e.test(a)) {
        d = Ub(a);
        za(b, c + "-opacity", d.get("a"));
        return d.get("rgb")
      }
      else return a
    },
    text: function (a, b, c) {
      var d = Sa.chart.style;
      b = fa(y(b, 0));
      c = fa(y(c, 0));
      a = this.createElement("text").attr({
        x: b,
        y: c,
        text: a
      }).css({
        "font-family": d.fontFamily,
        "font-size": d.fontSize
      });
      a.x = b;
      a.y = c;
      return a
    }
  };
  var Ma;
  if (!wc) {
    var ge = xb(Hc, {
      init: function (a, b) {
        var c = ["<", b, ' filled="f" stroked="f"'],
            d = ["position: ", lc, ";"];
        if (b == "shape" || b == Lb) d.push("left:0;top:0;width:10px;height:10px;");
        if (yc) d.push("visibility: ", b == Lb ? vb : Bb);
        c.push(' style="', d.join(""), '"/>');
        if (b) {
          c = b == Lb || b == "span" || b == "img" ? c.join("") : a.prepVML(c);
          this.element = fb(c)
        }
        this.renderer = a
      },
      add: function (a) {
        var b = this.renderer,
            c = this.element,
            d = b.box;
        d = a ? a.element || a : d;
        a && a.inverted && b.invertChild(c, d);
        yc && d.gVis == vb && Ia(c, {
          visibility: vb
        });
        d.appendChild(c);
        this.added = true;
        this.alignOnAdd && this.updateTransform();
        return this
      },
      attr: function (a, b) {
        var c, d, e, f = this.element || {},
            g = f.style,
            i = f.nodeName,
            k = this.renderer,
            j = this.symbolName,
            n, z, F = this.shadows,
            W = this;
        if (Kb(a) && J(b)) {
          c = a;
          a = {};
          a[c] = b
        }
        if (Kb(a)) {
          c = a;
          W = c == "strokeWidth" || c == "stroke-width" ? this.strokeweight : this[c]
        }
        else for (c in a) {
          d = a[c];
          n = false;
          if (j && /^(x|y|r|start|end|width|height|innerR)/.test(c)) {
            if (!z) {
              this.symbolAttr(a);
              z = true
            }
            n = true
          }
          else if (c == "d") {
            d = d || [];
            this.d = d.join(" ");
            e = d.length;
            for (n = []; e--;) n[e] = ac(d[e]) ? fa(d[e] * 10) - 5 : d[e] == "Z" ? "x" : d[e];
            d = n.join(" ") || "x";
            f.path = d;
            if (F) for (e = F.length; e--;) F[e].path = d;
            n = true
          }
          else if (c == "zIndex" || c == "visibility") {
            if (yc && c == "visibility" && i == "DIV") {
              f.gVis = d;
              n = f.childNodes;
              for (e = n.length; e--;) Ia(n[e], {
                visibility: d
              });
              if (d == Bb) d = null
            }
            if (d) g[c] = d;
            n = true
          }
          else if (/^(width|height)$/.test(c)) {
            if (this.updateClipping) {
              this[c] = d;
              this.updateClipping()
            }
            else g[c] = d;
            n = true
          }
          else if (/^(x|y)$/.test(c)) {
            this[c] = d;
            if (f.tagName == "SPAN") this.updateTransform();
            else g[{
              x: "left",
              y: "top"
            }[c]] = d
          }
          else if (c == "class") f.className = d;
          else if (c == "stroke") {
            d = k.color(d, f, c);
            c = "strokecolor"
          }
          else if (c == "stroke-width" || c == "strokeWidth") {
            f.stroked = d ? true : false;
            c = "strokeweight";
            this[c] = d;
            if (ac(d)) d += $a
          }
          else if (c == "dashstyle") {
            (f.getElementsByTagName("stroke")[0] || fb(k.prepVML(["<stroke/>"]), null, null, f))[c] = d || "solid";
            this.dashstyle = d;
            n = true
          }
          else if (c == "fill") if (i == "SPAN") g.color = d;
          else {
            f.filled = d != nb ? true : false;
            d = k.color(d, f, c);
            c = "fillcolor"
          }
          else if (c == "translateX" || c == "translateY" || c == "rotation" || c == "align") {
            if (c == "align") c = "textAlign";
            this[c] = d;
            this.updateTransform();
            n = true
          }
          else if (c == "text") {
            f.innerHTML = d;
            n = true
          }
          if (F && c == "visibility") for (e = F.length; e--;) F[e].style[c] = d;
          if (!n) if (yc) f[c] = d;
          else za(f, c, d)
        }
        return W
      },
      clip: function (a) {
        var b = this,
            c = a.members;
        c.push(b);
        b.destroyClip = function () {
          mc(c, b)
        };
        return b.css(a.getCSS(b.inverted))
      },
      css: function (a) {
        var b = this.element;
        if (b = a && b.tagName == "SPAN" && a.width) {
          delete a.width;
          this.textWidth = b;
          this.updateTransform()
        }
        this.styles = qa(this.styles, a);
        Ia(this.element, a);
        return this
      },
      destroy: function () {
        this.destroyClip && this.destroyClip();
        Hc.prototype.destroy.apply(this)
      },
      empty: function () {
        for (var a = this.element.childNodes, b = a.length, c; b--;) {
          c = a[b];
          c.parentNode.removeChild(c)
        }
      },
      getBBox: function () {
        var a = this.element;
        if (a.nodeName == "text") a.style.position = lc;
        return {
          x: a.offsetLeft,
          y: a.offsetTop,
          width: a.offsetWidth,
          height: a.offsetHeight
        }
      },
      on: function (a, b) {
        this.element["on" + a] = function () {
          var c = ib.event;
          c.target = c.srcElement;
          b(c)
        };
        return this
      },
      updateTransform: function () {
        if (this.added) {
          var a = this,
              b = a.element,
              c = a.translateX || 0,
              d = a.translateY || 0,
              e = a.x || 0,
              f = a.y || 0,
              g = a.textAlign || "left",
              i = {
              left: 0,
              center: 0.5,
              right: 1
              }[g],
              k = g && g != "left";
          if (c || d) a.css({
            marginLeft: c,
            marginTop: d
          });
          a.inverted && t(b.childNodes, function (I) {
            a.renderer.invertChild(I, b)
          });
          if (b.tagName == "SPAN") {
            var j, n;
            c = a.rotation;
            var z;
            j = 0;
            d = 1;
            var F = 0,
                W;
            z = oa(a.textWidth);
            var ca = a.xCorr || 0,
                ka = a.yCorr || 0,
                v = [c, g, b.innerHTML, a.textWidth].join(",");
            if (v != a.cTT) {
              if (J(c)) {
                j = c * Ud;
                d = kb(j);
                F = zb(j);
                Ia(b, {
                  filter: c ? ["progid:DXImageTransform.Microsoft.Matrix(M11=", d, ", M12=", -F, ", M21=", F, ", M22=", d, ", sizingMethod='auto expand')"].join("") : nb
                })
              }
              j = b.offsetWidth;
              n = b.offsetHeight;
              if (j > z) {
                Ia(b, {
                  width: z + $a,
                  display: "block",
                  whiteSpace: "normal"
                });
                j = z
              }
              z = fa(oa(b.style.fontSize || 12) * 1.2);
              ca = d < 0 && -j;
              ka = F < 0 && -n;
              W = d * F < 0;
              ca += F * z * (W ? 1 - i : i);
              ka -= d * z * (c ? W ? i : 1 - i : 1);
              if (k) {
                ca -= j * i * (d < 0 ? -1 : 1);
                if (c) ka -= n * i * (F < 0 ? -1 : 1);
                Ia(b, {
                  textAlign: g
                })
              }
              a.xCorr = ca;
              a.yCorr = ka
            }
            Ia(b, {
              left: e + ca,
              top: f + ka
            });
            a.cTT = v
          }
        }
        else this.alignOnAdd = true
      },
      shadow: function (a) {
        var b = [],
            c = this.element,
            d = this.renderer,
            e, f = c.style,
            g, i = c.path;
        if ("" + c.path === "") i = "x";
        if (a) {
          for (a = 1; a <= 3; a++) {
            g = ['<shape isShadow="true" strokeweight="', 7 - 2 * a, '" filled="false" path="', i, '" coordsize="100,100" style="', c.style.cssText, '" />'];
            e = fb(d.prepVML(g), null, {
              left: oa(f.left) + 1,
              top: oa(f.top) + 1
            });
            g = ['<stroke color="black" opacity="', 0.05 * a, '"/>'];
            fb(d.prepVML(g), null, null, e);
            c.parentNode.insertBefore(e, c);
            b.push(e)
          }
          this.shadows = b
        }
        return this
      }
    });
    Ma = function () {
      this.init.apply(this, arguments)
    };
    Ma.prototype = ya(Uc.prototype, {
      isIE8: xc.indexOf("MSIE 8.0") > -1,
      init: function (a, b, c) {
        var d;
        this.Element = ge;
        this.alignedObjects = [];
        d = this.createElement(Lb);
        a.appendChild(d.element);
        this.box = d.element;
        this.boxWrapper = d;
        this.setSize(b, c, false);
        if (!Aa.namespaces.hcv) {
          Aa.namespaces.add("hcv", "urn:schemas-microsoft-com:vml");
          Aa.createStyleSheet().cssText = "hcv\\:fill, hcv\\:path, hcv\\:shape, hcv\\:stroke{ behavior:url(#default#VML); display: inline-block; } "
        }
      },
      clipRect: function (a, b, c, d) {
        var e = this.createElement();
        return qa(e, {
          members: [],
          left: a,
          top: b,
          width: c,
          height: d,
          getCSS: function (f) {
            var g = this.top,
                i = this.left,
                k = i + this.width,
                j = g + this.height;
            g = {
              clip: "rect(" + fa(f ? i : g) + "px," + fa(f ? j : k) + "px," + fa(f ? k : j) + "px," + fa(f ? g : i) + "px)"
            };
            !f && yc && qa(g, {
              width: k + $a,
              height: j + $a
            });
            return g
          },
          updateClipping: function () {
            t(e.members, function (f) {
              f.css(e.getCSS(f.inverted))
            })
          }
        })
      },
      color: function (a, b, c) {
        var d, e = /^rgba/;
        if (a && a.linearGradient) {
          var f, g, i = a.linearGradient,
              k, j, n, z;
          t(a.stops, function (F, W) {
            if (e.test(F[1])) {
              d = Ub(F[1]);
              f = d.get("rgb");
              g = d.get("a")
            }
            else {
              f = F[1];
              g = 1
            }
            if (W) {
              n = f;
              z = g
            }
            else {
              k = f;
              j = g
            }
          });
          a = 90 - Ua.atan((i[3] - i[1]) / (i[2] - i[0])) * 180 / Tb;
          c = ["<", c, ' colors="0% ', k, ",100% ", n, '" angle="', a, '" opacity="', z, '" o:opacity2="', j, '" type="gradient" focus="100%" />'];
          fb(this.prepVML(c), null, null, b)
        }
        else if (e.test(a) && b.tagName != "IMG") {
          d = Ub(a);
          c = ["<", c, ' opacity="', d.get("a"), '"/>'];
          fb(this.prepVML(c), null, null, b);
          return d.get("rgb")
        }
        else return a
      },
      prepVML: function (a) {
        var b = this.isIE8;
        a = a.join("");
        if (b) {
          a = a.replace("/>", ' xmlns="urn:schemas-microsoft-com:vml" />');
          a = a.indexOf('style="') == -1 ? a.replace("/>", ' style="display:inline-block;behavior:url(#default#VML);" />') : a.replace('style="', 'style="display:inline-block;behavior:url(#default#VML);')
        }
        else a = a.replace("<", "<hcv:");
        return a
      },
      text: function (a, b, c) {
        var d = Sa.chart.style;
        return this.createElement("span").attr({
          text: a,
          x: fa(b),
          y: fa(c)
        }).css({
          whiteSpace: "nowrap",
          fontFamily: d.fontFamily,
          fontSize: d.fontSize
        })
      },
      path: function (a) {
        return this.createElement("shape").attr({
          coordsize: "100 100",
          d: a
        })
      },
      circle: function (a, b, c) {
        return this.path(this.symbols.circle(a, b, c))
      },
      g: function (a) {
        var b;
        if (a) b = {
          className: Zb + a,
          "class": Zb + a
        };
        return this.createElement(Lb).attr(b)
      },
      image: function (a, b, c, d, e) {
        var f = this.createElement("img").attr({
          src: a
        });
        arguments.length > 1 && f.css({
          left: b,
          top: c,
          width: d,
          height: e
        });
        return f
      },
      rect: function (a, b, c, d, e, f) {
        if (Eb(a)) {
          b = a.y;
          c = a.width;
          d = a.height;
          e = a.r;
          a = a.x
        }
        var g = this.symbol("rect");
        g.r = e;
        return g.attr(g.crisp(f, a, b, Ca(c, 0), Ca(d, 0)))
      },
      invertChild: function (a, b) {
        var c = b.style;
        Ia(a, {
          flip: "x",
          left: oa(c.width) - 10,
          top: oa(c.height) - 10,
          rotation: -90
        })
      },
      symbols: {
        arc: function (a, b, c, d) {
          var e = d.start,
              f = d.end,
              g = kb(e),
              i = zb(e),
              k = kb(f),
              j = zb(f);
          d = d.innerR;
          var n = 0.07 / c,
              z = d && 0.1 / d || 0;
          if (f - e === 0) return ["x"];
          else if (2 * Tb - f + e < n) k = -n;
          else if (f - e < z) k = kb(e + z);
          return ["wa", a - c, b - c, a + c, b + c, a + c * g, b + c * i, a + c * k, b + c * j, "at", a - d, b - d, a + d, b + d, a + d * k, b + d * j, a + d * g, b + d * i, "x", "e"]
        },
        circle: function (a, b, c) {
          return ["wa", a - c, b - c, a + c, b + c, a + c, b, a + c, b, "e"]
        },
        rect: function (a, b, c, d) {
          if (!J(d)) return [];
          var e = d.width;
          d = d.height;
          var f = a + e,
              g = b + d;
          c = pb(c, e, d);
          return [Za, a + c, b, Da, f - c, b, "wa", f - 2 * c, b, f, b + 2 * c, f - c, b, f, b + c, Da, f, g - c, "wa", f - 2 * c, g - 2 * c, f, g, f, g - c, f - c, g, Da, a + c, g, "wa", a, g - 2 * c, a + 2 * c, g, a + c, g, a, g - c, Da, a, b + c, "wa", a, b, a + 2 * c, b + 2 * c, a, b + c, a + c, b, "x", "e"]
        }
      }
    })
  }
  var Qd = wc ? Uc : Ma;
  Hd.prototype.callbacks = [];
  var zc = function () {};
  zc.prototype = {
    init: function (a, b) {
      var c;
      this.series = a;
      this.applyOptions(b);
      this.pointAttr = {};
      if (a.options.colorByPoint) {
        c = a.chart.options.colors;
        if (!this.options) this.options = {};
        this.color = this.options.color = this.color || c[Jb++];
        if (Jb >= c.length) Jb = 0
      }
      a.chart.pointCount++;
      return this
    },
    applyOptions: function (a) {
      var b = this.series;
      this.config = a;
      if (ac(a) || a === null) this.y = a;
      else if (Eb(a) && !ac(a.length)) {
        qa(this, a);
        this.options = a
      }
      else if (Kb(a[0])) {
        this.name = a[0];
        this.y = a[1]
      }
      else if (ac(a[0])) {
        this.x = a[0];
        this.y = a[1]
      }
      if (this.x === Ra) this.x = b.autoIncrement()
    },
    destroy: function () {
      var a = this,
          b = a.series,
          c;
      b.chart.pointCount--;
      a == b.chart.hoverPoint && a.onMouseOut();
      b.chart.hoverPoints = null;
      Cb(a);
      t(["graphic", "tracker", "group", "dataLabel", "connector"], function (d) {
        a[d] && a[d].destroy()
      });
      a.legendItem && a.series.chart.legend.destroyItem(a);
      for (c in a) a[c] = null
    },
    select: function (a, b) {
      var c = this,
          d = c.series.chart;
      c.selected = a = y(a, !c.selected);
      c.firePointEvent(a ? "select" : "unselect");
      c.setState(a && "select");
      b || t(d.getSelectedPoints(), function (e) {
        if (e.selected && e != c) {
          e.selected = false;
          e.setState(db);
          e.firePointEvent("unselect")
        }
      })
    },
    onMouseOver: function () {
      var a = this.series.chart,
          b = a.tooltip,
          c = a.hoverPoint;
      c && c != this && c.onMouseOut();
      this.firePointEvent("mouseOver");
      b && !b.shared && b.refresh(this);
      this.setState(yb);
      a.hoverPoint = this
    },
    onMouseOut: function () {
      this.firePointEvent("mouseOut");
      this.setState();
      this.series.chart.hoverPoint = null
    },
    tooltipFormatter: function (a) {
      var b = this.series;
      return ['<span style="color:' + b.color + '">', this.name || b.name, "</span>: ", !a ? "<b>x = " + (this.name || this.x) + ",</b> " : "", "<b>", !a ? "y = " : "", this.y, "</b><br/>"].join("")
    },
    getDataLabelText: function () {
      return this.series.options.dataLabels.formatter.call({
        x: this.x,
        y: this.y,
        series: this.series,
        point: this,
        percentage: this.percentage,
        total: this.total || this.stackTotal
      })
    },
    update: function (a, b, c) {
      var d = this,
          e = d.series,
          f = d.dataLabel,
          g = d.graphic,
          i = e.chart;
      b = y(b, true);
      d.firePointEvent("update", {
        options: a
      }, function () {
        d.applyOptions(a);
        f && f.attr({
          text: d.getDataLabelText()
        });
        if (Eb(a)) {
          e.getAttribs();
          g && g.attr(d.pointAttr[e.state])
        }
        e.isDirty = true;
        b && i.redraw(c)
      })
    },
    remove: function (a, b) {
      var c = this,
          d = c.series,
          e = d.chart,
          f = d.data;
      bc(b, e);
      a = y(a, true);
      c.firePointEvent("remove", null, function () {
        mc(f, c);
        c.destroy();
        d.isDirty = true;
        a && e.redraw()
      })
    },
    firePointEvent: function (a, b, c) {
      var d = this,
          e = this.series.options;
      if (e.point.events[a] || d.options && d.options.events && d.options.events[a]) this.importEvents();
      if (a == "click" && e.allowPointSelect) c = function (f) {
        d.select(null, f.ctrlKey || f.metaKey || f.shiftKey)
      };
      La(this, a, b, c)
    },
    importEvents: function () {
      if (!this.hasImportedEvents) {
        var a = ya(this.series.options.point, this.options).events,
            b;
        this.events = a;
        for (b in a) Qa(this, b, a[b]);
        this.hasImportedEvents = true
      }
    },
    setState: function (a) {
      var b = this.series,
          c = b.options.states,
          d = wb[b.type].marker && b.options.marker,
          e = d && !d.enabled,
          f = (d = d && d.states[a]) && d.enabled === false,
          g = b.stateMarkerGraphic,
          i = b.chart,
          k = this.pointAttr;
      a || (a = db);
      if (!(a == this.state || this.selected && a != "select" || c[a] && c[a].enabled === false || a && (f || e && !d.enabled))) {
        if (this.graphic) this.graphic.attr(k[a]);
        else {
          if (a) {
            if (!g) b.stateMarkerGraphic = g = i.renderer.circle(0, 0, k[a].r).attr(k[a]).add(b.group);
            g.translate(this.plotX, this.plotY)
          }
          if (g) g[a ? "show" : "hide"]()
        }
        this.state = a
      }
    }
  };
  var mb = function () {};
  mb.prototype = {
    isCartesian: true,
    type: "line",
    pointClass: zc,
    pointAttrToOptions: {
      stroke: "lineColor",
      "stroke-width": "lineWidth",
      fill: "fillColor",
      r: "radius"
    },
    init: function (a, b) {
      var c, d;
      d = a.series.length;
      this.chart = a;
      b = this.setOptions(b);
      qa(this, {
        index: d,
        options: b,
        name: b.name || "Series " + (d + 1),
        state: db,
        pointAttr: {},
        visible: b.visible !== false,
        selected: b.selected === true
      });
      d = b.events;
      for (c in d) Qa(this, c, d[c]);
      if (d && d.click || b.point && b.point.events && b.point.events.click || b.allowPointSelect) a.runTrackerClick = true;
      this.getColor();
      this.getSymbol();
      this.setData(b.data, false)
    },
    autoIncrement: function () {
      var a = this.options,
          b = this.xIncrement;
      b = y(b, a.pointStart, 0);
      this.pointInterval = y(this.pointInterval, a.pointInterval, 1);
      this.xIncrement = b + this.pointInterval;
      return b
    },
    cleanData: function () {
      var a = this.chart,
          b = this.data,
          c, d, e = a.smallestInterval,
          f, g;
      b.sort(function (i, k) {
        return i.x - k.x
      });
      for (g = b.length - 1; g >= 0; g--) b[g - 1] && b[g - 1].x == b[g].x && b.splice(g - 1, 1);
      for (g = b.length - 1; g >= 0; g--) if (b[g - 1]) {
        f = b[g].x - b[g - 1].x;
        if (d === Ra || f < d) {
          d = f;
          c = g
        }
      }
      if (e === Ra || d < e) a.smallestInterval = d;
      this.closestPoints = c
    },
    getSegments: function () {
      var a = -1,
          b = [],
          c = this.data;
      t(c, function (d, e) {
        if (d.y === null) {
          e > a + 1 && b.push(c.slice(a + 1, e));
          a = e
        }
        else e == c.length - 1 && b.push(c.slice(a + 1, e + 1))
      });
      this.segments = b
    },
    setOptions: function (a) {
      var b = this.chart.options.plotOptions;
      return ya(b[this.type], b.series, a)
    },
    getColor: function () {
      var a = this.chart.options.colors;
      this.color = this.options.color || a[Jb++] || "#0000ff";
      if (Jb >= a.length) Jb = 0
    },
    getSymbol: function () {
      var a = this.chart.options.symbols;
      this.symbol = this.options.marker.symbol || a[Yc++];
      if (Yc >= a.length) Yc = 0
    },
    addPoint: function (a, b, c, d) {
      var e = this.data,
          f = this.graph,
          g = this.area,
          i = this.chart;
      a = (new this.pointClass).init(this, a);
      bc(d, i);
      if (f && c) f.shift = c;
      if (g) {
        g.shift = c;
        g.isArea = true
      }
      b = y(b, true);
      e.push(a);
      c && e[0].remove(false);
      this.isDirty = true;
      b && i.redraw()
    },
    setData: function (a, b) {
      var c = this,
          d = c.data,
          e = c.initialColor,
          f = c.chart,
          g = d && d.length || 0;
      c.xIncrement = null;
      if (J(e)) Jb = e;
      for (a = jc(nc(a || []), function (i) {
        return (new c.pointClass).init(c, i)
      }); g--;) d[g].destroy();
      c.data = a;
      c.cleanData();
      c.getSegments();
      c.isDirty = true;
      f.isDirtyBox = true;
      y(b, true) && f.redraw(false)
    },
    remove: function (a, b) {
      var c = this,
          d = c.chart;
      a = y(a, true);
      if (!c.isRemoving) {
        c.isRemoving = true;
        La(c, "remove", null, function () {
          c.destroy();
          d.isDirtyLegend = d.isDirtyBox = true;
          a && d.redraw(b)
        })
      }
      c.isRemoving = false
    },
    translate: function () {
      for (var a = this.chart, b = this.options.stacking, c = this.xAxis.categories, d = this.yAxis, e = this.data, f = e.length; f--;) {
        var g = e[f],
            i = g.x,
            k = g.y,
            j = g.low,
            n = d.stacks[(k < 0 ? "-" : "") + this.stackKey];
        g.plotX = this.xAxis.translate(i);
        if (b && this.visible && n && n[i]) {
          j = n[i];
          i = j.total;
          j.cum = j = j.cum - k;
          k = j + k;
          if (b == "percent") {
            j = i ? j * 100 / i : 0;
            k = i ? k * 100 / i : 0
          }
          g.percentage = i ? g.y * 100 / i : 0;
          g.stackTotal = i
        }
        if (J(j)) g.yBottom = d.translate(j, 0, 1);
        if (k !== null) g.plotY = d.translate(k, 0, 1);
        g.clientX = a.inverted ? a.plotHeight - g.plotX : g.plotX;
        g.category = c && c[g.x] !== Ra ? c[g.x] : g.x
      }
    },
    setTooltipPoints: function (a) {
      var b = this.chart,
          c = b.inverted,
          d = [],
          e = fa((c ? b.plotTop : b.plotLeft) + b.plotSizeX),
          f, g, i = [];
      if (a) this.tooltipPoints = null;
      t(this.segments, function (k) {
        d = d.concat(k)
      });
      if (this.xAxis && this.xAxis.reversed) d = d.reverse();
      t(d, function (k, j) {
        f = d[j - 1] ? d[j - 1].high + 1 : 0;
        for (g = k.high = d[j + 1] ? ob((k.plotX + (d[j + 1] ? d[j + 1].plotX : e)) / 2) : e; f <= g;) i[c ? e - f++ : f++] = k
      });
      this.tooltipPoints = i
    },
    onMouseOver: function () {
      var a = this.chart,
          b = a.hoverSeries;
      if (!(!Ib && a.mouseIsDown)) {
        b && b != this && b.onMouseOut();
        this.options.events.mouseOver && La(this, "mouseOver");
        this.tracker && this.tracker.toFront();
        this.setState(yb);
        a.hoverSeries = this
      }
    },
    onMouseOut: function () {
      var a = this.options,
          b = this.chart,
          c = b.tooltip,
          d = b.hoverPoint;
      d && d.onMouseOut();
      this && a.events.mouseOut && La(this, "mouseOut");
      c && !a.stickyTracking && c.hide();
      this.setState();
      b.hoverSeries = null
    },
    animate: function (a) {
      var b = this.chart,
          c = this.clipRect,
          d = this.options.animation;
      if (d && !Eb(d)) d = {};
      if (a) {
        if (!c.isAnimating) {
          c.attr("width", 0);
          c.isAnimating = true
        }
      }
      else {
        c.animate({
          width: b.plotSizeX
        }, d);
        this.animate = null
      }
    },
    drawPoints: function () {
      var a, b = this.data,
          c = this.chart,
          d, e, f, g, i, k;
      if (this.options.marker.enabled) for (f = b.length; f--;) {
        g = b[f];
        d = g.plotX;
        e = g.plotY;
        k = g.graphic;
        if (e !== Ra && !isNaN(e)) {
          a = g.pointAttr[g.selected ? "select" : db];
          i = a.r;
          if (k) k.animate({
            x: d,
            y: e,
            r: i
          });
          else g.graphic = c.renderer.symbol(y(g.marker && g.marker.symbol, this.symbol), d, e, i).attr(a).add(this.group)
        }
      }
    },
    convertAttribs: function (a, b, c, d) {
      var e = this.pointAttrToOptions,
          f, g, i = {};
      a = a || {};
      b = b || {};
      c = c || {};
      d = d || {};
      for (f in e) {
        g = e[f];
        i[f] = y(a[g], b[f], c[f], d[f])
      }
      return i
    },
    getAttribs: function () {
      var a = this,
          b = wb[a.type].marker ? a.options.marker : a.options,
          c = b.states,
          d = c[yb],
          e, f = a.color,
          g = {
          stroke: f,
          fill: f
          },
          i = a.data,
          k = [],
          j, n = a.pointAttrToOptions;
      if (a.options.marker) {
        d.radius = d.radius || b.radius + 2;
        d.lineWidth = d.lineWidth || b.lineWidth + 1
      }
      else d.color = d.color || Ub(d.color || f).brighten(d.brightness).get();
      k[db] = a.convertAttribs(b, g);
      t([yb, "select"], function (F) {
        k[F] = a.convertAttribs(c[F], k[db])
      });
      a.pointAttr = k;
      for (f = i.length; f--;) {
        g = i[f];
        if ((b = g.options && g.options.marker || g.options) && b.enabled === false) b.radius = 0;
        e = false;
        if (g.options) for (var z in n) if (J(b[n[z]])) e = true;
        if (e) {
          j = [];
          c = b.states || {};
          e = c[yb] = c[yb] || {};
          if (!a.options.marker) e.color = Ub(e.color || g.options.color).brighten(e.brightness || d.brightness).get();
          j[db] = a.convertAttribs(b, k[db]);
          j[yb] = a.convertAttribs(c[yb], k[yb], j[db]);
          j.select = a.convertAttribs(c.select, k.select, j[db])
        }
        else j = k;
        g.pointAttr = j
      }
    },
    destroy: function () {
      var a = this,
          b = a.chart,
          c = /\/5[0-9\.]+ (Safari|Mobile)\//.test(xc),
          d, e;
      Cb(a);
      a.legendItem && a.chart.legend.destroyItem(a);
      t(a.data, function (f) {
        f.destroy()
      });
      t(["area", "graph", "dataLabelsGroup", "group", "tracker"], function (f) {
        if (a[f]) {
          d = c && f == "group" ? "hide" : "destroy";
          a[f][d]()
        }
      });
      if (b.hoverSeries == a) b.hoverSeries = null;
      mc(b.series, a);
      for (e in a) delete a[e]
    },
    drawDataLabels: function () {
      if (this.options.dataLabels.enabled) {
        var a, b, c = this.data,
            d = this.options.dataLabels,
            e, f = this.dataLabelsGroup,
            g = this.chart,
            i = g.inverted,
            k = this.type,
            j;
        if (!f) f = this.dataLabelsGroup = g.renderer.g(Zb + "data-labels").attr({
          visibility: this.visible ? Bb : vb,
          zIndex: 5
        }).translate(g.plotLeft, g.plotTop).add();
        j = d.color;
        if (j == "auto") j = null;
        d.style.color = y(j, this.color);
        t(c, function (n) {
          var z = n.barX;
          z = z && z + n.barW / 2 || n.plotX || -999;
          var F = y(n.plotY, -999),
              W = n.dataLabel,
              ca = d.align;
          e = n.getDataLabelText();
          a = (i ? g.plotWidth - F : z) + d.x;
          b = (i ? g.plotHeight - z : F) + d.y;
          if (k == "column") a += {
            left: -1,
            right: 1
          }[ca] * n.barW / 2 || 0;
          if (W) W.animate({
            x: a,
            y: b
          });
          else if (J(e)) W = n.dataLabel = g.renderer.text(e, a, b).attr({
            align: ca,
            rotation: d.rotation,
            zIndex: 1
          }).css(d.style).add(f);
          i && !d.y && W.attr({
            y: b + parseInt(W.styles.lineHeight) * 0.9 - W.getBBox().height / 2
          })
        })
      }
    },
    drawGraph: function () {
      var a = this,
          b = a.options,
          c = a.graph,
          d = [],
          e, f = a.area,
          g = a.group,
          i = b.lineColor || a.color,
          k = b.lineWidth,
          j = b.dashStyle,
          n, z = a.chart.renderer,
          F = a.yAxis.getThreshold(b.threshold || 0),
          W = /^area/.test(a.type),
          ca = [],
          ka = [];
      t(a.segments, function (v) {
        n = [];
        t(v, function (U, R) {
          if (a.getPointSpline) n.push.apply(n, a.getPointSpline(v, U, R));
          else {
            n.push(R ? Da : Za);
            R && b.step && n.push(U.plotX, v[R - 1].plotY);
            n.push(U.plotX, U.plotY)
          }
        });
        if (v.length > 1) d = d.concat(n);
        else ca.push(v[0]);
        if (W) {
          var I = [],
              da, X = n.length;
          for (da = 0; da < X; da++) I.push(n[da]);
          X == 3 && I.push(Da, n[1], n[2]);
          if (b.stacking && a.type != "areaspline") for (da = v.length - 1; da >= 0; da--) I.push(v[da].plotX, v[da].yBottom);
          else I.push(Da, v[v.length - 1].plotX, F, Da, v[0].plotX, F);
          ka = ka.concat(I)
        }
      });
      a.graphPath = d;
      a.singlePoints = ca;
      if (W) {
        e = y(b.fillColor, Ub(a.color).setOpacity(b.fillOpacity || 0.75).get());
        if (f) f.animate({
          d: ka
        });
        else a.area = a.chart.renderer.path(ka).attr({
          fill: e
        }).add(g)
      }
      if (c) c.animate({
        d: d
      });
      else if (k) {
        c = {
          stroke: i,
          "stroke-width": k
        };
        if (j) c.dashstyle = j;
        a.graph = z.path(d).attr(c).add(g).shadow(b.shadow)
      }
    },
    render: function () {
      var a = this,
          b = a.chart,
          c, d, e = a.options,
          f = e.animation,
          g = f && a.animate;
      f = g ? f && f.duration || 500 : 0;
      var i = a.clipRect;
      d = b.renderer;
      if (!i) {
        i = a.clipRect = !b.hasRendered && b.clipRect ? b.clipRect : d.clipRect(0, 0, b.plotSizeX, b.plotSizeY);
        if (!b.clipRect) b.clipRect = i
      }
      if (!a.group) {
        c = a.group = d.g("series");
        if (b.inverted) {
          d = function () {
            c.attr({
              width: b.plotWidth,
              height: b.plotHeight
            }).invert()
          };
          d();
          Qa(b, "resize", d)
        }
        c.clip(a.clipRect).attr({
          visibility: a.visible ? Bb : vb,
          zIndex: e.zIndex
        }).translate(b.plotLeft, b.plotTop).add(b.seriesGroup)
      }
      a.drawDataLabels();
      g && a.animate(true);
      a.getAttribs();
      a.drawGraph && a.drawGraph();
      a.drawPoints();
      a.options.enableMouseTracking !== false && a.drawTracker();
      g && a.animate();
      setTimeout(function () {
        i.isAnimating = false;
        if ((c = a.group) && i != b.clipRect && i.renderer) {
          c.clip(a.clipRect = b.clipRect);
          i.destroy()
        }
      }, f);
      a.isDirty = false
    },
    redraw: function () {
      var a = this.chart,
          b = this.group;
      if (b) {
        a.inverted && b.attr({
          width: a.plotWidth,
          height: a.plotHeight
        });
        b.animate({
          translateX: a.plotLeft,
          translateY: a.plotTop
        })
      }
      this.translate();
      this.setTooltipPoints(true);
      this.render()
    },
    setState: function (a) {
      var b = this.options,
          c = this.graph,
          d = b.states;
      b = b.lineWidth;
      a = a || db;
      if (this.state != a) {
        this.state = a;
        if (!(d[a] && d[a].enabled === false)) {
          if (a) b = d[a].lineWidth || b + 1;
          if (c && !c.dashstyle) c.attr({
            "stroke-width": b
          }, a ? 0 : 500)
        }
      }
    },
    setVisible: function (a, b) {
      var c = this.chart,
          d = this.legendItem,
          e = this.group,
          f = this.tracker,
          g = this.dataLabelsGroup,
          i, k = this.data,
          j = c.options.chart.ignoreHiddenSeries;
      i = this.visible;
      i = (this.visible = a = a === Ra ? !i : a) ? "show" : "hide";
      e && e[i]();
      if (f) f[i]();
      else for (e = k.length; e--;) {
        f = k[e];
        f.tracker && f.tracker[i]()
      }
      g && g[i]();
      d && c.legend.colorizeItem(this, a);
      this.isDirty = true;
      this.options.stacking && t(c.series, function (n) {
        if (n.options.stacking && n.visible) n.isDirty = true
      });
      if (j) c.isDirtyBox = true;
      b !== false && c.redraw();
      La(this, i)
    },
    show: function () {
      this.setVisible(true)
    },
    hide: function () {
      this.setVisible(false)
    },
    select: function (a) {
      this.selected = a = a === Ra ? !this.selected : a;
      if (this.checkbox) this.checkbox.checked = a;
      La(this, a ? "select" : "unselect")
    },
    drawTracker: function () {
      var a = this,
          b = a.options,
          c = [].concat(a.graphPath),
          d = c.length,
          e = a.chart,
          f = e.options.tooltip.snap,
          g = a.tracker,
          i = b.cursor;
      i = i && {
        cursor: i
      };
      var k = a.singlePoints,
          j;
      if (d) for (j = d + 1; j--;) {
        c[j] == Za && c.splice(j + 1, 0, c[j + 1] - f, c[j + 2], Da);
        if (j && c[j] == Za || j == d) c.splice(j, 0, Da, c[j - 2] + f, c[j - 1])
      }
      for (j = 0; j < k.length; j++) {
        d = k[j];
        c.push(Za, d.plotX - f, d.plotY, Da, d.plotX + f, d.plotY)
      }
      if (g) g.attr({
        d: c
      });
      else a.tracker = e.renderer.path(c).attr({
        isTracker: true,
        stroke: Vd,
        fill: nb,
        "stroke-width": b.lineWidth + 2 * f,
        visibility: a.visible ? Bb : vb,
        zIndex: 1
      }).on(Ib ? "touchstart" : "mouseover", function () {
        e.hoverSeries != a && a.onMouseOver()
      }).on("mouseout", function () {
        b.stickyTracking || a.onMouseOut()
      }).css(i).add(e.trackerGroup)
    }
  };
  Ma = xb(mb);
  ub.line = Ma;
  Ma = xb(mb, {
    type: "area"
  });
  ub.area = Ma;
  Ma = xb(mb, {
    type: "spline",
    getPointSpline: function (a, b, c) {
      var d = b.plotX,
          e = b.plotY,
          f = a[c - 1],
          g = a[c + 1],
          i, k, j, n;
      if (c && c < a.length - 1) {
        a = f.plotY;
        j = g.plotX;
        g = g.plotY;
        var z;
        i = (1.5 * d + f.plotX) / 2.5;
        k = (1.5 * e + a) / 2.5;
        j = (1.5 * d + j) / 2.5;
        n = (1.5 * e + g) / 2.5;
        z = (n - k) * (j - d) / (j - i) + e - n;
        k += z;
        n += z;
        if (k > a && k > e) {
          k = Ca(a, e);
          n = 2 * e - k
        }
        else if (k < a && k < e) {
          k = pb(a, e);
          n = 2 * e - k
        }
        if (n > g && n > e) {
          n = Ca(g, e);
          k = 2 * e - n
        }
        else if (n < g && n < e) {
          n = pb(g, e);
          k = 2 * e - n
        }
        b.rightContX = j;
        b.rightContY = n
      }
      if (c) {
        b = ["C", f.rightContX || f.plotX, f.rightContY || f.plotY, i || d, k || e, d, e];
        f.rightContX = f.rightContY = null
      }
      else b = [Za, d, e];
      return b
    }
  });
  ub.spline = Ma;
  Ma = xb(Ma, {
    type: "areaspline"
  });
  ub.areaspline = Ma;
  var ad = xb(mb, {
    type: "column",
    pointAttrToOptions: {
      stroke: "borderColor",
      "stroke-width": "borderWidth",
      fill: "color",
      r: "borderRadius"
    },
    init: function () {
      mb.prototype.init.apply(this, arguments);
      var a = this,
          b = a.chart;
      b.hasColumn = true;
      b.hasRendered && t(b.series, function (c) {
        if (c.type == a.type) c.isDirty = true
      })
    },
    translate: function () {
      var a = this,
          b = a.chart,
          c = 0,
          d = a.xAxis.reversed,
          e = a.xAxis.categories,
          f = {},
          g, i;
      mb.prototype.translate.apply(a);
      t(b.series, function (I) {
        if (I.type == a.type) {
          if (I.options.stacking) {
            g = I.stackKey;
            if (f[g] === Ra) f[g] = c++;
            i = f[g]
          }
          else if (I.visible) i = c++;
          I.columnIndex = i
        }
      });
      var k = a.options,
          j = a.data,
          n = a.closestPoints;
      b = cb(j[1] ? j[n].plotX - j[n - 1].plotX : b.plotSizeX / (e ? e.length : 1));
      e = b * k.groupPadding;
      n = (b - 2 * e) / c;
      var z = k.pointWidth,
          F = J(z) ? (n - z) / 2 : n * k.pointPadding,
          W = Ca(y(z, n - 2 * F), 1),
          ca = F + (e + ((d ? c - a.columnIndex : a.columnIndex) || 0) * n - b / 2) * (d ? -1 : 1),
          ka = a.yAxis.getThreshold(k.threshold || 0),
          v = y(k.minPointLength, 5);
      t(j, function (I) {
        var da = I.plotY,
            X = I.yBottom || ka,
            U = I.plotX + ca,
            R = fd(pb(da, X)),
            Ha = fd(Ca(da, X) - R),
            Ya;
        if (cb(Ha) < v) {
          if (v) {
            Ha = v;
            R = cb(R - ka) > v ? X - v : ka - (da <= ka ? v : 0)
          }
          Ya = R - 3
        }
        qa(I, {
          barX: U,
          barY: R,
          barW: W,
          barH: Ha
        });
        I.shapeType = "rect";
        I.shapeArgs = {
          x: U,
          y: R,
          width: W,
          height: Ha,
          r: k.borderRadius
        };
        I.trackerArgs = J(Ya) && ya(I.shapeArgs, {
          height: Ca(6, Ha + 3),
          y: Ya
        })
      })
    },
    getSymbol: function () {},
    drawGraph: function () {},
    drawPoints: function () {
      var a = this,
          b = a.options,
          c = a.chart.renderer,
          d, e;
      t(a.data, function (f) {
        var g = f.plotY;
        if (g !== Ra && !isNaN(g)) {
          d = f.graphic;
          e = f.shapeArgs;
          if (d) {
            Sc(d);
            d.animate(e)
          }
          else f.graphic = c[f.shapeType](e).attr(f.pointAttr[f.selected ? "select" : db]).add(a.group).shadow(b.shadow)
        }
      })
    },
    drawTracker: function () {
      var a = this,
          b = a.chart,
          c = b.renderer,
          d, e, f = +new Date,
          g = a.options.cursor,
          i = g && {
          cursor: g
          },
          k;
      t(a.data, function (j) {
        e = j.tracker;
        d = j.trackerArgs || j.shapeArgs;
        if (j.y !== null) if (e) e.attr(d);
        else j.tracker = c[j.shapeType](d).attr({
          isTracker: f,
          fill: Vd,
          visibility: a.visible ? Bb : vb,
          zIndex: 1
        }).on(Ib ? "touchstart" : "mouseover", function (n) {
          k = n.relatedTarget || n.fromElement;
          b.hoverSeries != a && za(k, "isTracker") != f && a.onMouseOver();
          j.onMouseOver()
        }).on("mouseout", function (n) {
          if (!a.options.stickyTracking) {
            k = n.relatedTarget || n.toElement;
            za(k, "isTracker") != f && a.onMouseOut()
          }
        }).css(i).add(b.trackerGroup)
      })
    },
    animate: function (a) {
      var b = this,
          c = b.data;
      if (!a) {
        t(c, function (d) {
          var e = d.graphic;
          if (e) {
            e.attr({
              height: 0,
              y: b.yAxis.translate(0, 0, 1)
            });
            e.animate({
              height: d.barH,
              y: d.barY
            }, b.options.animation)
          }
        });
        b.animate = null
      }
    },
    remove: function () {
      var a = this,
          b = a.chart;
      b.hasRendered && t(b.series, function (c) {
        if (c.type == a.type) c.isDirty = true
      });
      mb.prototype.remove.apply(a, arguments)
    }
  });
  ub.column = ad;
  Ma = xb(ad, {
    type: "bar",
    init: function (a) {
      a.inverted = this.inverted = true;
      ad.prototype.init.apply(this, arguments)
    }
  });
  ub.bar = Ma;
  Ma = xb(mb, {
    type: "scatter",
    translate: function () {
      var a = this;
      mb.prototype.translate.apply(a);
      t(a.data, function (b) {
        b.shapeType = "circle";
        b.shapeArgs = {
          x: b.plotX,
          y: b.plotY,
          r: a.chart.options.tooltip.snap
        }
      })
    },
    drawTracker: function () {
      var a = this,
          b = a.options.cursor,
          c = b && {
          cursor: b
          },
          d;
      t(a.data, function (e) {
        (d = e.graphic) && d.attr({
          isTracker: true
        }).on("mouseover", function () {
          a.onMouseOver();
          e.onMouseOver()
        }).on("mouseout", function () {
          a.options.stickyTracking || a.onMouseOut()
        }).css(c)
      })
    },
    cleanData: function () {}
  });
  ub.scatter = Ma;
  Ma = xb(zc, {
    init: function () {
      zc.prototype.init.apply(this, arguments);
      var a = this,
          b;
      qa(a, {
        visible: a.visible !== false,
        name: y(a.name, "Slice")
      });
      b = function () {
        a.slice()
      };
      Qa(a, "select", b);
      Qa(a, "unselect", b);
      return a
    },
    setVisible: function (a) {
      var b = this.series.chart,
          c = this.tracker,
          d = this.dataLabel,
          e = this.connector,
          f;
      f = (this.visible = a = a === Ra ? !this.visible : a) ? "show" : "hide";
      this.group[f]();
      c && c[f]();
      d && d[f]();
      e && e[f]();
      this.legendItem && b.legend.colorizeItem(this, a)
    },
    slice: function (a, b, c) {
      var d = this.series.chart,
          e = this.slicedTranslation;
      bc(c, d);
      y(b, true);
      a = this.sliced = J(a) ? a : !this.sliced;
      this.group.animate({
        translateX: a ? e[0] : d.plotLeft,
        translateY: a ? e[1] : d.plotTop
      })
    }
  });
  Ma = xb(mb, {
    type: "pie",
    isCartesian: false,
    pointClass: Ma,
    pointAttrToOptions: {
      stroke: "borderColor",
      "stroke-width": "borderWidth",
      fill: "color"
    },
    getColor: function () {
      this.initialColor = Jb
    },
    animate: function () {
      var a = this;
      t(a.data, function (b) {
        var c = b.graphic;
        b = b.shapeArgs;
        var d = -Tb / 2;
        if (c) {
          c.attr({
            r: 0,
            start: d,
            end: d
          });
          c.animate({
            r: b.r,
            start: b.start,
            end: b.end
          }, a.options.animation)
        }
      });
      a.animate = null
    },
    translate: function () {
      var a = 0,
          b = -0.25,
          c = this.options,
          d = c.slicedOffset,
          e = d + c.borderWidth,
          f = c.center,
          g = this.chart,
          i = g.plotWidth,
          k = g.plotHeight,
          j, n, z, F = this.data,
          W = 2 * Tb,
          ca, ka = pb(i, k),
          v, I, da, X = c.dataLabels.distance;
      f.push(c.size, c.innerSize || 0);
      f = jc(f, function (U, R) {
        return (v = /%$/.test(U)) ? [i, k, ka, ka][R] * oa(U) / 100 : U
      });
      this.getX = function (U, R) {
        z = Ua.asin((U - f[1]) / (f[2] / 2 + X));
        return f[0] + (R ? -1 : 1) * kb(z) * (f[2] / 2 + X)
      };
      this.center = f;
      t(F, function (U) {
        a += U.y
      });
      t(F, function (U) {
        ca = a ? U.y / a : 0;
        j = fa(b * W * 1E3) / 1E3;
        b += ca;
        n = fa(b * W * 1E3) / 1E3;
        U.shapeType = "arc";
        U.shapeArgs = {
          x: f[0],
          y: f[1],
          r: f[2] / 2,
          innerR: f[3] / 2,
          start: j,
          end: n
        };
        z = (n + j) / 2;
        U.slicedTranslation = jc([kb(z) * d + g.plotLeft, zb(z) * d + g.plotTop], fa);
        I = kb(z) * f[2] / 2;
        da = zb(z) * f[2] / 2;
        U.tooltipPos = [f[0] + I * 0.7, f[1] + da * 0.7];
        U.labelPos = [f[0] + I + kb(z) * X, f[1] + da + zb(z) * X, f[0] + I + kb(z) * e, f[1] + da + zb(z) * e, f[0] + I, f[1] + da, X < 0 ? "center" : z < W / 4 ? "left" : "right", z];
        U.percentage = ca * 100;
        U.total = a
      });
      this.setTooltipPoints()
    },
    render: function () {
      this.getAttribs();
      this.drawPoints();
      this.options.enableMouseTracking !== false && this.drawTracker();
      this.drawDataLabels();
      this.options.animation && this.animate && this.animate();
      this.isDirty = false
    },
    drawPoints: function () {
      var a = this.chart,
          b = a.renderer,
          c, d, e, f;
      t(this.data, function (g) {
        d = g.graphic;
        f = g.shapeArgs;
        e = g.group;
        if (!e) e = g.group = b.g("point").attr({
          zIndex: 5
        }).add();
        c = g.sliced ? g.slicedTranslation : [a.plotLeft, a.plotTop];
        e.translate(c[0], c[1]);
        if (d) d.animate(f);
        else g.graphic = b.arc(f).attr(qa(g.pointAttr[db], {
          "stroke-linejoin": "round"
        })).add(g.group);
        g.visible === false && g.setVisible(false)
      })
    },
    drawDataLabels: function () {
      var a = this.data,
          b, c = this.chart,
          d = this.options.dataLabels,
          e = y(d.connectorPadding, 10),
          f = y(d.connectorWidth, 1),
          g, i, k = d.distance > 0,
          j, n, z = this.center[1],
          F = [
          [],
          [],
          [],
          []
          ],
          W, ca, ka, v, I, da, X, U = 4,
          R;
      mb.prototype.drawDataLabels.apply(this);
      t(a, function (Ha) {
        var Ya = Ha.labelPos[7];
        F[Ya < 0 ? 0 : Ya < Tb / 2 ? 1 : Ya < Tb ? 2 : 3].push(Ha)
      });
      F[1].reverse();
      F[3].reverse();
      for (X = function (Ha, Ya) {
        return Ha.y > Ya.y
      }; U--;) {
        a = 0;
        b = [].concat(F[U]);
        b.sort(X);
        for (R = b.length; R--;) b[R].rank = R;
        for (v = 0; v < 2; v++) {
          n = (da = U % 3) ? 9999 : -9999;
          I = da ? -1 : 1;
          for (R = 0; R < F[U].length; R++) {
            b = F[U][R];
            if (g = b.dataLabel) {
              i = b.labelPos;
              ka = Bb;
              W = i[0];
              ca = i[1];
              j || (j = g && g.getBBox().height);
              if (k) if (v && b.rank < a) ka = vb;
              else if (!da && ca < n + j || da && ca > n - j) {
                ca = n + I * j;
                W = this.getX(ca, U > 1);
                if (!da && ca + j > z || da && ca - j < z) if (v) ka = vb;
                else a++
              }
              if (b.visible === false) ka = vb;
              if (ka == Bb) n = ca;
              if (v) {
                g.attr({
                  visibility: ka,
                  align: i[6]
                })[g.moved ? "animate" : "attr"]({
                  x: W + d.x + ({
                    left: e,
                    right: -e
                  }[i[6]] || 0),
                  y: ca + d.y
                });
                g.moved = true;
                if (k && f) {
                  g = b.connector;
                  i = [Za, W + (i[6] == "left" ? 5 : -5), ca, Da, W, ca, Da, i[2], i[3], Da, i[4], i[5]];
                  if (g) {
                    g.animate({
                      d: i
                    });
                    g.attr("visibility", ka)
                  }
                  else b.connector = g = this.chart.renderer.path(i).attr({
                    "stroke-width": f,
                    stroke: d.connectorColor || "#606060",
                    visibility: ka,
                    zIndex: 3
                  }).translate(c.plotLeft, c.plotTop).add()
                }
              }
            }
          }
        }
      }
    },
    drawTracker: ad.prototype.drawTracker,
    getSymbol: function () {}
  });
  ub.pie = Ma;
  ib.Highcharts = {
    Chart: Hd,
    dateFormat: Mc,
    pathAnim: $c,
    getOptions: function () {
      return Sa
    },
    numberFormat: Gd,
    Point: zc,
    Color: Ub,
    Renderer: Qd,
    seriesTypes: ub,
    setOptions: function (a) {
      Sa = ya(Sa, a);
      Bd();
      return Sa
    },
    Series: mb,
    addEvent: Qa,
    createElement: fb,
    discardElement: Fc,
    css: Ia,
    each: t,
    extend: qa,
    map: jc,
    merge: ya,
    pick: y,
    extendClass: xb,
    version: "2.1.4"
  }
})();